您的位置:首页 > 其它

为什么 没有缺省构造函数的类类型成员 必需要在初始化列表 里初始化 ?

2016-06-06 15:22 591 查看
名词解释
    1、缺省构造函数:类的构造函数无参或参数默认值统称为缺省构造函数。

    2、初始化列表:与其它函数不同,构造函数除了有名字,参数列表和函数体外还可以有初始化列表。列表以冒号开始后跟以逗号隔开的初始化字段。类成员是在构造函数的初始化列表创建好的,在创建类成员的同时,给成员变量一个初始化值。

在解释原因之前,需要了解构造函数是如何执行的
构造函数的执行过程
    首先,构造函数的执行分为三步。先创建函数的形参(如果没有形参这步可以省略),然后执行初始化列表(即使没有初试化列表),最后执行函数体的内容。

    没有初始化列表时,系统在创建类成员时会给成员一个初值。根据对象的作用域不同,初值也不同。代码证明请见附录1                                           
    (1)全局的对象和局部的static对象,系统会对 int类型的成员赋初值0,指针类型的成        员赋初值0x00000000。
    (2)除static类型外的局部对象,系统对成员赋一个随机值。
                                                                                                            
在执行函数体时,类成员已被创建好,并且有一个初值。函数体内给成员值时不是初始化,而是赋值。

可以通过下面的代码证明证明这一问题。
下面先给类B一个默认参数,这样就不需要在A的构造函数的初始化列表里初始化B类型的A成员。
                                                                                        

[code=cpp;toolbar:false">#include <iostream>
#include <cstdlib>

using namespace std;

class B
{
public:
B(int  data=0)
:_data(data)
{
cout << "B()" << endl;

}

B(const B &b)
:_data(b._data)
{
cout << "B(const B &)" << endl;
}

B & operator=(const B &b)
{
cout << "operator=" << endl;
_data = b._data;
return *this;
}

~B()
{
cout << "~B()" << endl;
}

private:
int _data;
};

class A
{
public:
A(B data = 1)
{
b = data;
cout << "A()" << endl;
}

~A()
{
cout << "~A()" << endl;
}

private:
B b;
};

int main()
{
{
A a(2);
}

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: