为什么 没有缺省构造函数的类类型成员 必需要在初始化列表 里初始化 ?
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;
}
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;
}
相关文章推荐
- C 指针&&表达式&&常量
- odoo销售流程代码简单剖析
- C 指针&&函数
- C 指针&&数组
- typedef 函数指针
- 栈帧
- iOS RTMP 视频直播开发笔记(5)------- iOS H.264 实时硬编码实现原理
- Xcode崩溃日志分析工具symbolicatecrash用法
- PHP7 + iis7配置
- AJAX
- Android生成桌面快捷图标
- Mon Jun 06 2016 08:00:00 GMT+0800 (中国标准时间)
- 最大熵模型中的数学推导
- Spring 的BeanUtils.copyProperties在拷贝属性时忽略空值
- 联想台式机关闭FN功能键
- OCP 052 001
- Java陷阱一箩筐----面试题集
- Phonenix安装(简化hbase的工具)
- opencv颜色过滤--------如何选择需要的颜色呢?
- php解析word文档