Effective_C++:12、在构造函数中尽量以initialization(初始化)动作取代assignment(赋值)动作

12、在构造函数中尽量以initialization(初始化)动作取代assignment(赋值)动作

1、initialization(初始化)动作

        首先,得强调一下,初始化动作是在 构造函数中使用的。仅当定义构造函数时,有两种方式将类的数据成员赋予某个特定的值(尽量使用成员初始化列表):
        1.使用初始化动作,即成员初始化列表。此时,是将该数据直接初始化为特定值,即调用该数据类型的某个构造函数将其值初始化为特定值。
        2.在构造函数中进行赋值动作。此处,就是执行数据的赋值动作,即调用数据类型的赋值操作符。
        构造函数,分两步执行:
        1.首先,数据成员初始化。即将类中的数据成员都进行初始化,若在成员初始化列表中,则调用对应的构造函数来初始化该数据;若不在成员初始化列表中,调用默认构造函数来初始化该数据。
        2.执行构造函数的代码语句。
        由上可知,执行构造函数前会先调用数据成员的构造函数进行初始化,初始化完成再执行该构造函数的函数体。

2、为啥要尽量以initialization(初始化)动作取代assignment(赋值)动作

        初始化动作是调用构造函数对数据进行初始化,赋值动作是调用赋值操作符对数据进行赋值操作。故从以下方面考虑,应以以initialization(初始化)动作取代assignment(赋值)动作:
        1.const成员和reference成员必须使用成员初始化列表。因为他们只能被初始化,不能被赋值。
        2.初始化动作比赋值动作更快,效率高。构造函数首先进行初始化,然后执行函数体。故初始化动作是直接将数据初始化为特定的值,调用对应的构造函数;而赋值动作是在其被初始化后再进行赋值操作,调用了默认构造函数和赋值操作符。
        然而,总有例外:当类中有一大堆内建型别的数据成员时,成员初始化列表将比较庞大,容易出错且不方便维护。为此,可以写一个private初始化函数,对这些数据进行初始化,在构造函数中调用初始化函数即可。
        最后,记得static成员是绝对不能在构造函数中被初始化的,因为他是类对象共同拥有,每次程序只初始化一次,故每次创建对象对他进行初始化是不合理的。

猜你喜欢

转载自blog.csdn.net/l1dian11/article/details/81012439