C++忽略了默认复制构造函数造成的疑惑:为什么“没有调用”构造,但却调用了析构
提前说一下,不是没有调用,所有对象创建时,一定调用,但是某些情况下会调用系统生成的构造
先来看一段诡异的代码:
class A {
private:
int a;
public:
A(int a = 0);
~A();
};
A::A(int a) {
this->a = a;
cout << this << "调用构造" << endl;
}
A::~A() {
cout << this << "调用析构" << endl;
}
A function(A obj) {
return obj;
}
int main() {
A obj;
function(obj);
return 0;
}
输出:
0136F7C4调用构造
0136F6E0调用析构
0136F6F8调用析构
0136F7C4调用析构
原因:
- 创建对象(分配空间)不一定调用构造?一定调用,有可能调用系统生成的
- 释放空间一定调用析构(除定位new分配的对象需要显式调用)
1.并不是所有对象创建都要调用构造?错误,原因如下
上述代码中,只有obj创建时调用了构造函数? 其实不是
函数function(A obj),这里的obj是个局部变量,它在创建的时候,隐式的进行了赋值(main()中的obj),同类对象之间赋值,会调用系统生成的复制构造函数
函数返回一个值,也就是生成了一个临时的对象存储返回值,这个时候,也进行了隐式的赋值(调用复制构造)
2.对象单元一但释放,就要调用析构函数
0136F7C4调用构造 <<main()中obj调用构造
0136F6E0调用析构 <<释放function()中obj
0136F6F8调用析构 <<释放返回值所占的临时空间
0136F7C4调用析构 <<释放main()中obj
3.给上述例子加一个默认的复制构造函数
A::A(A &obj) {
cout << this << "调用构造" << endl;
}
输出:
00D6F78F调用构造 <<main()中obj调用构造
00D6F68C调用构造 <<function()中obj调用构造
00D6F687调用构造 <<返回值临时变量调用构造
00D6F68C调用析构 <<释放function()中obj
00D6F687调用析构 <<释放返回值的临时变量
00D6F78F调用析构 <<释放main()中obj