pppploi8's Blog

欢迎来到pppploi8的个人博客!

C++ Primer学习笔记-构造函数初始化式

语法如下

Object::Object():a(0),b(false),c(0.0){ }

构造函数初始化列表以一个冒号开始,跟着逗号分割的数据成员列表,每个成员后面跟着圆括号里放初始化式。

构造函数初始化式一般用在无默认无参构造函数的对象,const成员变量等地方,比如

class ObjectA{
public:
    ObjectA(int a){
        cout << "ObjectA初始化:" << a << endl;
    }
}; 
class ObjectB{
public:
    ObjectB(int a):oa(a),max(a){
        cout << "ObjectB初始化:" << a << endl; 
    }
private:
    ObjectA oa;
    const int max;
}; 
int main() {
    ObjectB b(233);
    return 0;
}

因为ObjectA没有提供默认无参构造函数,所以如果不使用初始化式是无法实例化oa的,除非把oa申明成一个ObjectA指针,然后oa = new ObjectA(a);来初始化它,然后在析构函数内delete oa;删除这个对象。至于max,因为是const int类型,也无法通过赋值方式来初始化,也只能使用初始化式进行初始化。

另外初始化的顺序是根据变量申明顺序而不是初始化式的顺序决定的。比如

class ObjectA{
public:
    ObjectA(int a):j(a),i(j){ }
    void print() const {
        cout << i << "|" << j << endl;
    } 
private:
    int i;
    int j; 
}; 
int main() {
    ObjectA a(233);
    a.print(); 
    return 0;
}
它看起来是使用a来初始化j,然后使用j来初始化i,理想的输出应该是233 233
然而实际上输出却是0 233

初始化顺序是按照变量声明顺序,也就是先初始化i,再初始化j的顺序来的,和初始化式里的顺序无关

另外,初始化式可以是任意表达式,比如 Object(int a):max(a*sizeof(int)){ }