
1.1 特征:
1.2 (C++11)代理构造函数
class Str{
//这个就是代理构造函数,在执行时,先执行Str(3),再执行Str()
//即先打印2,再打印1
Str():Str(3)
{
std::cout << "1" << std::endl;
}
Str(int value){
std::cout << "2" << std::endl;
x = value;
}
private:
int x;
}
为什么有初始化的概念?是为了提升软件速度。初始化可以为变量赋初始值,赋值是把一个变量拷贝给另一个变量,所以赋值不涉及内存的分配。所以如果先初始化,再赋值的效率 < 直接初始化赋值的效率。
所以在构造函数时最好使用初始化列表,什么是初始化列表呢?如下
class Str()
{
Str(int value, std::string a)
//这个就是初始化列表
:x(value)
,y(a)
{
//这个是赋值
x = value;
}
private:
int x;
std::string y;
}
要注意的地方:
class Str()
{
Str(int& value){
//引用初始化,注意传参要加&,不然引用的是形参的对象,形参销毁会有问题?
:x(value)
}
private:
int& x;
}
注意元素的初始化顺序与其声明顺序相关,与初始化列表中的顺序无关,
为什么?因为初始化列表中的顺序有多种,但是程序销毁时是有顺序的(即后构造,先销毁),所以也必须要规定程序的初始化顺序,所以要按照声明的顺序进行初始化。
使用初始化列表覆盖类内成员初始化的行为
什么意思?两个概念,一个是初始化列表,一个是类内成员初始化
如下:
class Str{
Str(int value, std::string name)
//初始化列表
: x(value)
, y(name)
{
}
private:
//类内成员初始化
int x = 3;
string y = "a";
}
int main()、
{
Str m(4,"b");
//实际m内部的x=4 y = "b",这是因为初始化列表在内成员初始化之后执行。
}
class Str()
{
//这个就是缺省构造函数
Str()
{
}
//这个也是缺省构造函数,因为3是默认的
Str(int value = 3){
}
}
意思是:
class Str{
private:
int x;
}
int main()
{
Str m; //right
//这里程序会认为下面是一个返回类型为Str的函数
Str m(); //wrong
//所以
Str m{}; //right
}
可以使用default关键字定义缺省构造函数
class Str(
Str() = default;
)