C++构造函数之初始化列表

article/2025/9/10 19:50:37

C++构造函数之初始化列表

构造函数可以说是对于C++每个类来说最重要的组成部分,之前也详细介绍过构造函数的相关知识,今天给构造函数进行补充,主要说明一下构造函数的初始值列表

一、初始化列表的写法

仍然以之前介绍构造函数时使用的学生类来举例说明:

class Student{
public:/*Student(int no, string name, int age){_no = no;_name = name;_age = age;//带参的构造函数}*/Student(int no, string name, int age):_no(no),_name(name),_age(age){}//初始化列表
private:int _no;string _name;int _age;
};

初始化列表出现了新的部分,以冒号开始,然后紧跟着的是以逗号为分隔符的数据成员列表,每个数据成员后面都有一个括号括号中的是该成员变量的初始值或表达式

二、初始化列表的注意事项

  1. 每个成员变量在初始化列表中只能出现一次,即初始化只会初始化一次,但是在构造函数的函数体中可以进行多次赋值,初始化与赋值的区别有一篇博客写的不错,推荐阅读:

    https://www.cnblogs.com/lxy-xf/p/11049963.html

    初始化的含义是创建变量时赋予它一个初始值,而赋值则是把对象的当前值擦去,用一个新值来代替!(C++primer中的描述)

  2. 当类中包含了:①引用成员变量;②const成员变量;③自定义类型的成员变量(该类没有自己的默认构造函数默认构造函数详解见https://blog.csdn.net/weixin_45523353/article/details/123216917的第四部分)时,必须将这些成员放在初始化列表中进行初始化!

    class A{
    public:A(int a){_a = a;//有参构造,没有默认构造函数}
    private:int _a;
    };class Student{
    public:Student(int a, int age):_aa(a),_age(age),_no(001){}//必须在初始化列表中进行初始化
    private:A _aa;//自定义类型,且没有自己的默认构造函数int& _age;//引用const int _no//const的成员变量
    };
    
  3. 建议大家尽量使用初始化列表进行初始化,因为自定义类型的成员变量一定会先使用初始化列表初始化,下面这个例子可以帮助理解一下

    class A {
    private:int _a;
    public:A(int a = 0) {_a = a;}
    };class B {
    private:A _aa;int _b = 1;
    public:B(int a, int b) {_b = b;_aa = A(a);//B这里并没有写出初始化列表}
    };
    int main(){B bb(20,15);//在这里打个断点return 0;
    }
    

    按照我们之前的理解,在创建B类型的变量bb时,使用的是B类型所提供的带参的构造函数,但是在监视窗口我们却发现,_b和_aa两个成员变量都已经被初始化了:

    image-20220303230435477

尽管我们没有显式地写出初始化列表,这里也认为是有初始化列表的,其中的两个成员变量会使用默认初始化列表进行初始化,可以认为初始化列表就是对象的成员变量定义的地方。

三、初始化的顺序

非常重要的地方:在初始化列表中的顺序并非成员变量的初始化顺序!,成员变量的初始化顺序只与它在类中的声明次序相同

class A{int a1;int a2;
public:A(int a):a2(a),a1(a2){}//这里会报编译错误
};

上面的例子虽然看起在初始化列表中先用形参a初始化a2,再用a2初始化a1,但是成员变量的初始化顺序不能看它们在初始化列表中的顺序,而要看的是声明的顺序,a1先于a2声明,因此编译器会先去初始化a1,但此时a2并没初始化,因此a1也就无法初始化了。

所以最好将初始化列表的各个成员顺序与类中的成员变量声明顺序保持一致,而且尽量不要用某个成员变量去初始化另一个成员变量!


http://chatgpt.dhexx.cn/article/rXT65EpH.shtml

相关文章

C++初始化列表详解

目录: 定义 使用初始化列表的原因 必须使用初始化列表的时候 成员变量的顺序 定义 与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号…

C++类的初始化列表

意义 初始化列表是类中构造函数的一部分,用于实例化类中变量时 赋初值。 需要先了解 构造函数的基本知识。CSDN-构造函数https://blog.csdn.net/weixin_44212838/article/details/124901019?spm1001.2014.3001.5501 用法 在函数头与函数体之间,用一…

详解初始化列表

初始化列表 定义 构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化列表)。初始化列表位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。 Date(int year, int month, in…

C++ 成员初始化列表

这里写目录标题 数据成员是某一个类的对象,且这个类没有默认构造函数数据成员的类型是const或者引用子类初始化父类初始化列表先后顺序使用成员初始化列表的优点 在以下三种情况下需要使用初始化成员列表: 需要初始化的数据成员是某一个类的对象&#xf…

【深入理解】初始化列表

目录 一、什么是初始化列表? 二、初始化列表长啥样? 三、初始化列表的特性 1、由于是在定义阶段进行的初始化,所以,只能在定义阶段进行的初始化类型便只能在初始化列表中进行初始化。 2、初始化顺序不是跟着初始化列表走的&#x…

C++ 初始化列表详解

目录 1.什么是初始化列表 2.什么时候需要使用初始化列表? 3.初始化列表的效率 4.初始化列表的初始化顺序 1.什么是初始化列表 class A { public:A(int value):m_dada(value){}private:int m_dada; }; 如上图,红色圈起来的部分,就是构造函…

【C++】-- 初始化列表

目录 一、用初始化列表初始化对象 1.初始化列表用法 2.初始化列表特性 二、explicit关键字 1.内置类型的隐式转换 2.如何避免单参构造函数初始化发生隐式类型转换 三、匿名对象 1.匿名对象定义 2.匿名对象应用场景 创建一个类对象时,编译器通过调用构造函…

字符串逆序(数组倒序输出)

题目信息: 样例输出 copy edcba 新手导读: 题目描述信息:字符串的倒序输出肯定是字符数组的倒序输出; 输入信息:输入条件是最后字符不为回车;所以应该先用变量存入字符进行判断,再使用这个…

C语言实现字符串倒序

C语言显示字符串倒序 倒序字符串的方法很多&#xff0c;这里给出常见的两种 1.倒序字符串指针法 void reverse_string(char *arr) {int len strlen(arr);char* left arr; //指向头部的指针char* right arr (len - 1); //指向尾部的指针char temp;while(left <…

C语言:输入一串字符串,并倒序输出(vs)

一&#xff1a;问题&#xff1a; 输入一串字符串倒序输出 例&#xff1a;输入abcdefg 输出gfedcba 二&#xff1a;思路&#xff1a; &#xff08;1&#xff09;先输入一串字符串&#xff0c;然后利用for语句倒序输出即可&#xff1b; 三&#xff1a;实现过程&#xff1a; …

字符串倒序输出

题目&#xff1a;输入一个字符串&#xff0c;将该串倒序输出。例如输入字符串hello&#xff0c;倒序输出为olleh。 str1 str(input(请输入字串: )) print(输入的字符是&#xff1a;%s%str1) str2 #定义一个空串用来接收倒序后的字串 for i in str1[::-1]:#对字串进行倒序输出…

字符串的倒叙输出(直接倒叙和单词倒叙)

一.字符串的直接倒叙 输入一个字符串&#xff0c;实现倒叙输出,我想到的方法有两种&#xff1a; 首先把输入的字符串存入一个数组&#xff1b; 1.方法一&#xff1a;直接逆序打印这个数组&#xff0c;即从最后一个元素向前打印&#xff1b; C代码&#xff1a; #include <std…

字符串倒序输出的五种方法

1. 使用数组循环 public static String array(String s){ int lengths.length(); char[] arrays.toCharArray(); for(int i0;i<length/2;i){ array[i]s.charAt(length-1-i); array[length-1-i]s.charAt(i); } return new String(array); } 2. StringBuffer的reverse方法 pu…

idea中git更新代码到本地之后自己写的代码不见了

今天在合并分支的时候不小心选错了合并选项&#xff0c;导致本地刚写的代码都没了 解决办法 1.找到本地历史记录 2.选择自己想要的版本 3.点击RevertSelection恢复

Git篇:使用Git将代码库更新到本地(完整版)

环境&#xff1a;Git已安装&#xff08;皮一下&#xff09; 新建一文件夹 右键&#xff0c;Git Bash Here git init 添加库 git remote add origin 想要更新的源码地址 将库里的代码下载到本地 git pull origin master 到此为止&#xff0c;第一次下载项目流程就结束了&am…

git 查看远程分支更新到本地,本地代码暂存,取出

一 、远程分支更新到本地 1.将一个项目更新到本地 git clone 项目地址 2.进入项目文件夹下 git branch 会显示 3. 在远端新建分支。 新建一个dev分支。大家合并的分支。再给每一个开发者建一个分支。比如我的jhj分支 4 .获取远端的分支&#xff0c;新建成功后在输入下边…

从远程仓库git更新(update)代码,显示更新成功,但是本地代码并没有改变

没有拉取更新成功的原因是本地有修改内容&#xff0c;解决方法如下&#xff1a; 1、在要更新的代码文件所在的文件夹&#xff08;含.git文件&#xff09;中打开gitBash&#xff0c;然后采用以下代码隐藏本地修改。 git stash结果如图&#xff1a; 2、选择IDEA中Git里面的upd…

git更新代码到本地后发现自己的代码不见了

解决办法&#xff1a; 利用webstorm的git插件恢复代码 然后选择你需要恢复的文件点击恢复按钮即可 可以双击文件查看要恢复的文件和本地文件的区别

GitHub上传本地代码/更新本地代码

上传本地代码 第一步&#xff1a;去github上创建自己的Repository&#xff0c;创建页面如下图所示&#xff1a; 红框为新建的仓库的https地址 第二步&#xff1a; echo “# aaa” >> README.md 注意&#xff1a;aaa是新创建的仓库名 第三步&#xff1a;建立git仓…

Git拉取上传更新代码

目录 一、将git上的项目拉取到本地 二、git提交更新代码 一、git上的项目拉取到本地 1.在本地创建一个文件夹 2.在本地文件夹中右键选择git bash here 3.在终端中输入克隆远程库的命令:git clone git上的项目地址 二、git提交更新代码 1.同步远程代码git pull origin mast…