c++中什么类型的成员变量只能在构造函数的初始化列表中进行

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

我想原因有二:

①考虑到效率

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

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

其实也不一定,

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

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

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

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

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

你可能感兴趣的:(c++中什么类型的成员变量只能在构造函数的初始化列表中进行)