构造
基本内容
不能声明为const
原因是常量对象完成构造函数的初始化后才获得常量属性,在此期间构造函数可以操作常量对象,声明也没用。
合成的默认构造函数
假如我们没有显式定义任何构造函数,编译器将为我们合成一个默认构造函数来初始化我们的成员变量。初始化原则:
1.有类内初始值的,按这些值初始化。
2.没有的,按变量默认初始化方式(未定义的行为)。
class A
{
int a = 0;
double b = 0; //这两句有类内初始值
char c;
}
注意的地方
1. 一旦我们定义了构造函数,系统不帮我们生成默认构造函数(不带任何形参),我们要自己定义一个。
2.还有一些系统不能帮我们合成默认构造函数的情况,比如类内成员有的没有默认构造函数,后面会讲到(见primer 13章)。
初始值列表
class A
{
int a = 0;
double b = 0; //这两句有类内初始值
char c;
A() = default; //代表和合成的一样的行为
A(const int &aa, const int &bb):a(aa),b(bb){}
}
高级点的
初始值列表和构造函数内赋值的区别
初始值列表初始化等价于变量的定义和初始化,而构造函数内赋值等价于变量的定义,默认初始化和赋值。
string foo = "Hello world!"; //初始值列表
string bar; //构造函数内赋值
bar = "Hello world!";
const成员和引用必须使用初始值列表,不能使用赋值法。
class ConstRef
{
public:
ConstRef(int ii);
private:
int i;
const int ci;
int &ri;
};
ConstRef::ConstRef(int ii):i(ii),ci(i),ri(i) {
}
初始化顺序
是类里定义顺序,不是初始值列表出现顺序
拷贝
赋值
析构
略,注意如果有动态内存分配,那么不能用以上三个的合成版本。
扫描二维码关注公众号,回复:
5886656 查看本文章