C++ 构造函数的初始化列表

来源:互联网 发布:100到999的水仙花数vb 编辑:程序博客网 时间:2024/06/05 06:59

在C++中,一个简单的构造函数可以如下所示:

class X{  private:    int i_;    int j_;  public:    X(int i, int j)    {        i_ = i;        j_ = j;    }};

C++也提供了另外一种初始化成员变量的写法,即初始化列表:

class X{  private:    int i_;    int j_;  public:    X(int i, int j):i_(i), j_(j){}};

第二种写法,就是构造函数初始化列表。那么问题来了,为什么要使用这个方法来写构造函数呢?有什么好处吗?那就要从C++的变量初始化说起。

C++变量初始化

首先,C++变量初始化有2种方法,直接初始化和复制初始化。复制初始化就是使用=号的初始化,而直接初始化就是使用()符号进行的初始化。
比如:

int age(20);  //直接初始化int age = 20; //复制初始化

复制初始化使用 = 号,很容易让人以为是进行了赋值操作而不是初始化操作,但是两者并不是一回事,初始化是给变量分配内存并且给它赋值,而赋值就是替换当前变量的值。
也就是说:

int age = 20; //初始化age = 30;     //赋值

第一行代码是初始化,第二行代码是赋值,虽然它们都是用了 = 号。

直接初始化比复制初始化更快,更灵活,大部分时间,看不出它们之间的区别,但在编写类的时候,就可能会看出来它们的区别。直接初始化时,编译器会调用构造函数直接赋值,而复制初始化时,编译器会先调用直接构造函数创建一个临时的对象,然后再调用复制构造函数进行赋值,所以直接初始化会更快。有时候,有些不支持复制的类型,就不能用复制初始化了。

因此,使用初始化列表,可以使初始化效率更高。

避免编译时期错误

还有一个更重要的原因,是因为使用初始化列表,可以避免编译时期的错误,因为有些成员变量,必须在初始化时赋值的。比如const 变量,还有一些没有默认构造函数的类,在初始化时,需要显式的传入参数进行初始化。

0 0