C++构造函数初始化成员列表

来源:互联网 发布:win7怎么卸载软件 编辑:程序博客网 时间:2024/06/09 18:13

C++初始化成员列表


1.只能在构造函数初始化列表初始化的成员变量的类型?

   a.const成员变量

   b.引用类型的成员变量

   c.static不能在初始化列表中进行初始化

   d.类成员变量中有自定义类型的变量最好在初始化列表中进行初始化

2.初始化列表的顺序?

   初始化列表的初始化顺序是依据类成员变量定义的顺序来决定的。

3.关于static const是否应该在初始化成员列表中初始化?

   static const为全局静态常量,全局的意思是该变量属于整个类而非某个类实例,所以不能再初始化列表中进行初始化。

1  好多书籍都建议我们直接使用初始化列表为成员进行初始化,为什么呢?

我想原因有二:

①考虑到效率

②有些成员不得不这么做(const,引用)

为什么使用初始化列表就效率呢?

其实也不一定,

对于内置类型,在函数体内赋值和在初始化列表中初始化两者的效率是等同的。但是为了美观和一致性的问题,《Effective C++》作者建议我们还是用初始化列表进行。但是这也不是在所有情况下都是必须的。若一个类的构造函数很多的时候,这时每个构造函数都有自己的初始列,这样多份成员的初始列就会导致烦人的重复。这时我们可以选择那些“赋值表现得像初始化一样好”的成员变量,改用它们为赋值。然后把他们放到一个函数中,供所有的构造函数调用。

对于类类型,两者的效率就相差很多了:

初始化列表的执行发生在进入函数体之前,它是在调用构造函数是进行初始化的。而对于函数体内的赋值(非初始化,而是赋值),它是首相调用了类的默认构造函数来初始化成员变量,而后在函数体中调用赋值函数为成员变量赋值的。显然这个和初始化列表相比默认构造函数的调用就浪费了。效率低了很多。

有些成员变量必须用初始化列表

const 和引用 类型的成员变量必须得用初始化列表进行初始化。其实这没什么高明的,也并不是一个明文规定。而是为遵守我们另一个规则而必须这么做。这个规则就是”const和引用类型的变量必须初始化“。而我们通过上面也明白了,函数体内是赋值而非初始化,若我们将const和引用类型的成员变量放在构造函数的函数体内的话。那么const和引用类型的变量将会没有初值,即没被初始化,根据我们另一个规则,当然会发生错误,编译器不允许我们这么做的。故:我们在构造函数中必须选择初始化列表对const和引用类型的成员变量进行初始化。


阅读全文
0 0