C++初始化列表

本博客将讲述C++初始化列表的相关内容

一.什么是初始化列表

图中红方框框的就是初始化列表

格式为:

:成员变量1(参数1),成员变量2(参数2)

编译器会将初始化列表一一转换成代码,并将这些代码放在用户编写的代码之前。

初始化列表的效果:

  在类定义中声明成员变量时,不建议使用初始化语句进行初始化(例如int x = 0),因为这种初始化方式将在构造函数调用之前执行,可能会导致其他部分的代码不能引用该成员变量的问题。初始化列表的方式是一种更好的初始化数据成员的方式,因为它将初始化操作与构造函数调用分开,可以保证成员变量的正确使用。使用初始化列表可以提高程序的效率和可读性,因为它可以避免在构造函数体中进行初始化,从而减少了构造函数的执行时间。使用初始化列表还可以确保各个成员变量被正确地初始化,从而避免因未初始化导致的错误。

二.什么时候使用初始化列表

1.有成员变量是引用类型时;

下图是使用了初始化列表的结果,编译成功。

2.当有数据成员是常量时;

类的数据成员有常量(const)时,必须使用初始化列表。

3.当父类的构造函数有参数时,在子类构造函数中使用初始化列表初始化父类参数;

class Base {
public:
    Base(int x) : _x(x) {}
private:
    int _x;
};

class Derived : public Base {
public:
    Derived(int x, int y) : Base(x), _y(y) {}
private:
    int _y;
};

父类的构造函数有参数时,子类若不使用初始化列表来初始化继承父类的成员,而是在构造函数体内调用父类构造函数,会报错。

但是如果父类的构造函数是全缺省,不会报错(注意参数数量)(代码如下图)

 

三.初始化列表的顺序

编译器会将初始化列表一一转换成代码,并将这些代码放在用户编写的代码之前。

注意:  初始化列表的初始化顺序是由数据成员的声明次序决定的,不是由初始化列表的排列次序决定的。

class B
{
private:
	int i;
	int j;
public:
	B(int value):j(value),i(j)
	{
		cout << "i = " << i << endl;
		cout << "j = " << j << endl;
	}
};
 
int main()
{
	B objC(10);
    return 0;
}

结果如下:

上述程序代码看起来像是要把 j 设初值为 value,再把 i 设初值为 j.问题在于,由于声明次序的原因,初始化列表中的”i (j)”其实比”j(value)”更早执行。但因为j 一开始未有初值,所以i(j)的执行结果导致无法预知其值。就输出随机值。

如何改进呢?将复制代码写在函数体中

class B
{
private:
	int i;
	int j;
public:
	B(int value):j(value)
	{
		i = j;
		cout << "i = " << i << endl;
		cout << "j = " << j << endl;
	}
};
 
int main()
{
	B objC(10);
    return 0;
}

注意:不能在子类构造函数的初始化列表中使用子类的成员函数给父类传参(除非该成员函数是返回常数,例如:Getage(){return 3}但这样没有意义)代码如下:

class Animal {
public:
	Animal(int _age) : age(_age) {}
	int age;
};

class Cat : public Animal {
public:
	Cat() : Animal(getAge()), age(3) {}
	void Print()
	{
		cout << Animal::age<<endl << Cat::age << endl;
	}
private:
	int age;
	int getAge() { return age; }
};
int main()
{
	Cat A;
	A.Print();
	return 0;
}

结果如下:

根据类成员在类中的声明顺序,在初始化列表中,父类的构造函数先执行(不管放在前还是后,所以建议放在最前)无法正确传参,所以传随机值。所以父类的构造函数要放在最前面,方便检查。

少年没有乌托邦,心向远方自明朗!

如果这个博客对你有帮助,给博主一个免费的点赞就是最大的帮助❤
欢迎各位点赞,收藏和关注哦❤
如果有疑问或有不同见解,欢迎在评论区留言❤
后续会继续更新大连理工大学相关课程和有关C++的内容和代码
点赞加关注,学习不迷路,好,本次的学习就到这里啦!!!

我们下次再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/476117.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

G - Find a way

题目分析 1.双重bfs,遍历两个起点求最短路再计算总和即可 2.唯一的坑点在于对于一个KFC&#xff0c;两人中可能有一个到不了&#xff0c;所以还要对到不了的点距离做处理 #include <bits/stdc.h> using namespace std; using ll long long; const int N 220;struct pos…

英伟达GTC大会看点:Blackwell芯片、推理微服务NIM、人形机器人

北京时间3月19日&#xff0c;英伟达创始人兼首席执行官黄仁勋在美国加州圣何塞SAP中心拉开了GTC大会帷幕&#xff0c;这是时隔5年重回线下的会议&#xff0c;现场吸引了11000多名与会者。大会上黄仁勋演讲了长达120分钟的主题分享《见证AI的变革时刻》&#xff0c;并发布了最新…

如何在edge上安装拓展weTab

1.点解管理拓展 2.点击获取拓展 3.搜索框输入"wetab"并搜索 4.点击获取按钮 5.点击之后跳出弹窗,点击"添加拓展" 6.回到拓展页面,找到wetab拓展,点击右侧启动拓展 7.打开新的界面,wetab已经启动 8.自定义界面 1. 右键图标可以进行删除操作 2.左下角有个设…

Vue3学习记录(七)--- 组合式API之指令和插件

一、内置指令 1、v-memo ​ 该指令是Vue3的v3.2版本之后新增的指令&#xff0c;用于实现组件模板缓存&#xff0c;优化组件更新时的性能。该指令接收一个固定长度的依赖值数组&#xff0c;在组件进行更新渲染时&#xff0c;如果数组中的每个依赖值都与上一次渲染时的值相同&a…

基于SSM的校园失物招领系统设计与实现+数据库+免费远程调试

项目介绍: 基于SSM的校园失物招领系统设计与实现。Javaee项目&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Mybatis JspVuelayuiElementui来实现。MySQL数…

Python脚本:用py处理PDF的五大功能

一、代码 【第三方库】3个 【Py版本】3.9 【使用前提】关闭所有的word文档 import os from datetime import datetime from docx2pdf import convert from pdf2docx import parse from PyPDF2 import PdfMerger from PyPDF2 import PdfReader,PdfWriter#将文件夹中的所有Wo…

模板高级使用(非类型模板参数,特化,分离编译)

文章目录 模板没有实例化取内嵌类型报错问题非类型模板参数模板的特化函数模板的特化类模板的特化1.全特化2.偏特化 模板的分离编译 模板没有实例化取内嵌类型报错问题 首先在这里分享一个模板的常见报错问题。就是模板的在没有实例化的情况下去取模板类里面的内嵌类型这时候的…

算法---二分查找

二分查找 1. 简述朴素的二分模板 2. 万能模板原理解释查找左端点查找右端点 查找左边界的二分模板查找右边界的二分模板 1. 简述 二分查找算法是一种在有序数组中查找特定元素的算法。它通过将数组分成两部分&#xff0c;并重复比较目标元素与中间元素的大小关系&#xff0c;从…

模板(初阶)

一、介绍&#xff1a; 1.1模板目的&#xff1a; 将重复的活&#xff0c;从程序员手中交给编译器执行。 1.2泛型编程&#xff1a; 编写与类型无关的通用代码&#xff0c;实现代码的复用。 二、函数模板&#xff1a; 2.1函数模板&#xff1a; 函数模板代表了一个函数家族&…

L4 级自动驾驶汽车发展综述

摘要:为了减小交通事故概率、降低运营成本、提高运营效率,实现安全、环保的出行,自动驾驶 技术的发展已成为大势所趋,而搭配有L4 级自动驾驶系统的车辆是将车辆驾驶全部交给系统。据此,介绍了自动驾驶汽车的主流技术解决方案;分析了国内外L4 级自动驾驶汽车的已发布车型、…

Java:接口

目录 1.接口的概念2.接口的语法规则3.接口使用4.接口的特性5.实现多个接口6.接口中的继承7.抽象类和接口的区别 1.接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的USB口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以…

【华为OD机试】悄悄话花费的时间【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收…

2024.03.21作业

自由发挥实现一个登录窗口的应用场景 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QPen> #include <QBrush> #include <QPainter> #include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; class Painter; } QT_END_NAMESPACE…

Vue 3中实现基于角色的权限认证实现思路

一、基于角色的权限认证主要步骤 在Vue 3中实现基于角色的权限认证通常涉及以下几个主要步骤&#xff1a; 定义角色和权限&#xff1a;首先需要在后端服务定义不同的角色和它们对应的权限。权限可以是对特定资源的访问权限&#xff0c;比如读取、写入、修改等。用户认证&#…

CSS问题精粹1

1.关于消除<li>列表前的符号 我相信很多人在初学CSS时会遇到该问题&#xff0c;无论是创作导航&#xff0c;还是列表&#xff0c;前面都会有个黑点点或其它符号。 解决该问题其实很简单 采用list-style-type:none或list-style:none直接解决 如果你想更换前面的黑点点&a…

Redis笔记(4)

目录 事务 管道 发布/订阅&#xff08;了解&#xff09; Redis复制&#xff08;replica&#xff09; 哨兵&#xff08;sentinel&#xff09;监控 集群分片 集群算法-分片-槽位slot&#xff1a; 配置Redis集群&#xff1a; 集群读写&#xff1a; 节点从属调整 主从扩容…

模拟面试题

一、IO多路复用的原理 将多个阻塞任务的文件描述符&#xff0c;统一放到一个检测容器中&#xff0c;然后用一个阻塞函数进行管理&#xff0c;如果检测容器有一个或多个文件描述符对应的事件产生&#xff0c;就会解除阻塞&#xff0c;进而去执行相应的函数。 二、实现IO多路复用…

数据表练习

思维导图 面试题答问1、IO多路复用的引入目的和原理 目的&#xff1a;在有操作系统时&#xff0c;可以用多线程和进程完成任务并发执行&#xff0c;没有操作系统的情况下可以使用IO多路复用技术来进行任务并发。 原理&#xff1a;将多个阻塞任务的文件描述符统一放到一个检查容…

大屏动效合集更更更之实现百分比环形

实现效果 参考链接&#xff1a; https://pslkzs.com/demo/pie/demo1.php 写在最后&#x1f352; 源码&#xff0c;关注&#x1f365;苏苏的bug&#xff0c;&#x1f361;苏苏的github&#xff0c;&#x1f36a;苏苏的码云