广州番禺专业建网站,山东建设厅官方网站一级建造师,上海做机床的公司网站,发光字体制作网站单参数构造函数
代码演示#xff1a;
class A
{
public:A(int i):_a(i){}private:int _a;
};
在 A 这个类中的构造函数只有一个参数#xff0c;这就称之为单参数的构造函数 不同形式实例化对象
代码演示#xff1a;
A a1(1);A a2 2;
a1 的实例化过程#xff1a;
第…单参数构造函数
代码演示
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 一样通过隐式类型准换实例化但是不能用小括号括起来要用大括号才可以
代码验证
可以看到和单参数构造函数一样优化成了直接构造