C++ ——— 单/多参数构造函数的隐式类型转换和 explicit 关键字
单参数构造函数
代码演示:
class A
{
public:
A(int i)
:_a(i)
{}
private:
int _a;
};
在 A 这个类中的构造函数只有一个参数,这就称之为单参数的构造函数
不同形式实例化对象
代码演示:
A a1(1);
A a2 = 2;
a1 的实例化过程:
第一个实例化对象 a1 是直接调用构造函数进行初始化的
a2 的实例化过程:
而第二个实例化对象 a2 是常量 2 调用构造函数生成一个临时对象,再用这个临时对象拷贝构造 a2 进行初始化的
但是编译器会对以上过程进行优化,优化为用 2 这个常量直接构造
验证 a2 是否是直接构造
代码演示:
class A
{
public:
// 构造
A(int i)
:_a(i)
{
cout << "A(int i)" << endl;
}
// 拷贝构造
A(const A& a)
:_a(a._a)
{
cout << "A(const A& a)" << endl;
}
private:
int _a;
};
对构造函数和拷贝构造函数都加上打印,看是否打印了拷贝构造就能知道 a2 是否是直接构造
代码验证:
可以看出,实例化 a1 和 a2 时都只调用了构造函数,并没有调用拷贝构造函数
explicit 关键字
关键字的作用是阻止隐式类型转换,这个关键字一般添加在构造函数的开始
代码演示:
explicit A(int i)
:_a(i)
{
cout << "A(int i)" << endl;
}
加上 explicit 关键字后,让常量2直接拷贝 a2 就不支持了
多参数拷贝函数的隐式类型转换
代码演示:
class A
{
public:
// 构造
A(int i,int k)
:_a1(i)
,_a2(k)
{
cout << "A(int i,int k)" << endl;
}
private:
int _a1;
int _a2;
};
在 A 这个类中有两个成员变量,构造函数的参数中也是两个,所以是多参数的拷贝函数
那么多参数拷贝函数如何隐式类型转换
代码演示:
A a1(1, 2);
A a2 = { 1,2 };
可以像 a1 一样直接调用拷贝构造函数实例化
也可以像 a2 一样通过隐式类型准换实例化,但是不能用小括号括起来,要用大括号才可以
代码验证:
可以看到,和单参数构造函数一样,优化成了直接构造