构造函数初始化列表的问题
- 无法按照表达式中的算符来修改值
- 原因
- 基本原则
- 由此引申的问题
- 使用初始化列表对类成员初始化
- 在构造函数中赋值对类成员初始化
- 针对构造函数传参,使用引用的情况
- 使用初始化列表对类成员初始化
- 在构造函数中赋值对类成员初始化
- 将属性也使用引用
- 总结
无法按照表达式中的算符来修改值
值没有按照初始化列表中的来赋值。
原因
在构造函数体中又多此一举的添加了
m_name = name;
m_age = age;
把这些代码注释掉就行。
修改以下:
基本原则
构造函数的执行可以分成两个阶段:初始化阶段和计算阶段(初始化阶段先于计算阶段)。
- 初始化阶段:全部的成员都会在初始化阶段初始化。
- 计算阶段:一般是指用于执行构造函数体内的赋值操作。
在计算阶段不用进行赋值操作,否则就是多此一举。
由此引申的问题
对于类成员初始化,可以使用初始化列表,也可以在构造函数中赋值(就是上面的两种方法,但不能同时使用,出现的问题上面也描述了)
但使用初始化列表对类成员初始化,在构造函数中赋值对类成员初始化,这两种方法的底层调用逻辑不一样。
流程都是:实参–>形式参数–>类成员
(用类创建对象时,先初始化构造函数的形参对象,然后再初始化类成员)
区分在于:
使用初始化列表对类成员初始化
实参->构造函数形参,调用传递参数(类)的拷贝构造函数
构造函数形参->类成员变量,调用传递参数(类)的拷贝构造函数
在构造函数中赋值对类成员初始化
实参->构造函数形参,调用传递参数(类)的拷贝构造函数
构造函数形参->类成员变量,先创建成员类的对象(将调用成员类的普通构造函数),然后再将构造函数形参的值赋值给类成员变量(赋值)
针对构造函数传参,使用引用的情况
在构造函数中参数使用引用,就省去了从实参到构造函数形参时,调用拷贝构造函数的过程。
使用初始化列表对类成员初始化
在构造函数中赋值对类成员初始化
将属性也使用引用
建议以后都使用初始化列表,不要一会儿初始化列表,一会儿又在构造函数内使用赋值语句初始化,会出问题
总结
如果使用初始化列表的赋值方案:
在构造函数参数中使用引用,省去了从实参到构造函数形参时,调用拷贝构造函数的过程。
在类成员变量中使用引用,省去了从构造函数形参到类变量时,调用拷贝构造函数的过程。
这里就不讨论构造函数内赋值初始化了,以后建议都是统一使用构造函数的初始化列表来初始化类成员变量。