C++初始化列表与类型转换全解析
.1 初始化列表
之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有⼀种方式,就是初始化列表
1.1.1 使用方式
初始化列表的使用方式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后面跟⼀个放在括号中的初始值或表达式。
示例:

1.1.2 细节部分
每个成员变量在初始化列表中只能出现一次。(这是什么意思?)

上面这种写法是错误的,在初始化列表中,每个成员变量只能出现一次!!!
接下来,我们来看一个比较难理解的一句话——
语法理解上初始化列表可以认为是每个成员变量定义初始化的地方!!!
这是啥意思?ok,我们先不看这句话。
我们先来想一想为什么祖师爷在创建C++语言时,既有函数体赋值,又有初始化列表呢?
其实是因为有些成员变量必须在初始化列表中初始化,引用成员变量,const成员变量,没有默认构造的自定义类型成员变量,必须放在初始化列表位置进行初始化,否则编译报错。

这里有个问题:

上图中的代码是对对象整体定义,开空间
我们必须给每个成员变量找个定义的地方,为什么?因为有些成员变量必须在定义时初始化,所以,基于以上原因,就有了初始化列表,普通成员可以在函数体内赋值,也可以在初始化列表中初始化,但引用成员变量,const成员变量,没有默认构造的自定义类型成员变量,必须放在初始化列表位置进行初始化。
建议:在初始化列表中一次性初始化,并且优先使用初始化列表。

其实上面的初始化列表中,有一个成员变量的初始化有些问题,那就是引用成员变量,_ref引用的x为局部变量,出了作用域就销毁了,如果d1中访问引用,就会有些问题,所以在初始化引用成员,不能引用普通的形参,最好引用外面的变量,将成员变量的引用域外面的一个变量关联起来。

我们再来看一种错误写法:

记住:引用成员变量,const成员变量,没有默认构造的自定义类型成员变量,必须放在初始化列表位置进行初始化,其他成员变量都可以。

ok,既然有了上图中写法,那我们是不是解决前面的一些问题: 在前面的学习中,我们写过一个MyQueue类中有Stack类的自定义类型

上面的这种是理想化,若Stack类中无默认构造呢?编译器会报错,MyQueue类中就必须写构造函数
那我们是按照下面的写法吗?

ok,通过上面的学习,我们已经知道在函数体内的是赋值,那我们直接将n赋值给_PushSt和_PopSt,这~对吗?这很明显不是正确的初始化。
更多推荐

所有评论(0)