构造函数初始化列表的问题

构造函数初始化列表的问题

  • 无法按照表达式中的算符来修改值
  • 原因
  • 基本原则
  • 由此引申的问题
    • 使用初始化列表对类成员初始化
    • 在构造函数中赋值对类成员初始化
  • 针对构造函数传参,使用引用的情况
    • 使用初始化列表对类成员初始化
    • 在构造函数中赋值对类成员初始化
  • 将属性也使用引用
  • 总结

无法按照表达式中的算符来修改值

构造函数初始化列表的问题_第1张图片
构造函数初始化列表的问题_第2张图片
构造函数初始化列表的问题_第3张图片

值没有按照初始化列表中的来赋值。

原因

在构造函数体中又多此一举的添加了

	m_name = name;
	m_age = age;

把这些代码注释掉就行。
在这里插入图片描述

修改以下:
构造函数初始化列表的问题_第4张图片

基本原则

构造函数的执行可以分成两个阶段:初始化阶段和计算阶段(初始化阶段先于计算阶段)。

  1. 初始化阶段:全部的成员都会在初始化阶段初始化。
  2. 计算阶段:一般是指用于执行构造函数体内的赋值操作。

在计算阶段不用进行赋值操作,否则就是多此一举。

由此引申的问题

对于类成员初始化,可以使用初始化列表也可以在构造函数中赋值(就是上面的两种方法,但不能同时使用,出现的问题上面也描述了)

但使用初始化列表对类成员初始化,在构造函数中赋值对类成员初始化,这两种方法的底层调用逻辑不一样。

流程都是:实参–>形式参数–>类成员
(用类创建对象时,先初始化构造函数的形参对象,然后再初始化类成员)
区分在于:

使用初始化列表对类成员初始化

实参->构造函数形参,调用传递参数(类)的拷贝构造函数
构造函数形参->类成员变量,调用传递参数(类)的拷贝构造函数
构造函数初始化列表的问题_第5张图片

构造函数初始化列表的问题_第6张图片
构造函数初始化列表的问题_第7张图片
构造函数初始化列表的问题_第8张图片

在构造函数中赋值对类成员初始化

实参->构造函数形参,调用传递参数(类)的拷贝构造函数
构造函数形参->类成员变量,先创建成员类的对象(将调用成员类的普通构造函数),然后再将构造函数形参的值赋值给类成员变量(赋值)
构造函数初始化列表的问题_第9张图片
构造函数初始化列表的问题_第10张图片
构造函数初始化列表的问题_第11张图片

构造函数初始化列表的问题_第12张图片

针对构造函数传参,使用引用的情况

在构造函数中参数使用引用,就省去了从实参到构造函数形参时,调用拷贝构造函数的过程。

使用初始化列表对类成员初始化

构造函数初始化列表的问题_第13张图片
构造函数初始化列表的问题_第14张图片
构造函数初始化列表的问题_第15张图片

在构造函数中赋值对类成员初始化

构造函数初始化列表的问题_第16张图片
构造函数初始化列表的问题_第17张图片
构造函数初始化列表的问题_第18张图片

将属性也使用引用

建议以后都使用初始化列表,不要一会儿初始化列表,一会儿又在构造函数内使用赋值语句初始化,会出问题
构造函数初始化列表的问题_第19张图片
构造函数初始化列表的问题_第20张图片
在这里插入图片描述
构造函数初始化列表的问题_第21张图片
构造函数初始化列表的问题_第22张图片

总结

如果使用初始化列表的赋值方案:
在构造函数参数中使用引用,省去了从实参到构造函数形参时,调用拷贝构造函数的过程。
在类成员变量中使用引用,省去了从构造函数形参到类变量时,调用拷贝构造函数的过程。

这里就不讨论构造函数内赋值初始化了,以后建议都是统一使用构造函数的初始化列表来初始化类成员变量。

你可能感兴趣的:(c++高级,c++)