我们先来看看测试程序和输出结果
#include <iostream.h>
class A{
public:
int a;
A(int m){a = m;cout<<"con"<<endl;}
~A(){cout<<"de"<<endl;}
};
A fun(void)
{
A a(0);
return a;
}
main()
{
A a(1);
cout<<"-----------"<<endl;
a = A(2);
cout<<"-----------"<<endl;
}
当主函数为:
main()
{
A a = A(1);
cout<<"-----------"<<endl;
}
输出为:
两个主函数中同样都有临时对象,可为什么第一个的临时对象有构造和析构,第二个却没有呢?
我的理解是这样的:在第一个中 a=A(2);并不是因为A(2)为一个临时对象,我们知道a已经初始化过了,不可能再被初始化,其实质是调用了运算符的重载operator=,A(2)作为一个实参传递给了运算符的重载,就像比如一个函数为void fun(int a),然后调用fun(3)的性质一样,A(2)当作是一个常数传递进了这个函数,但这个函数的形参从A(2)拷贝过来的时候需要调用复制构造函数,假如operator=这个运算符重载函数的形参为Q,那么当A(2)传进函数的时候,Q需要构造,当函数结束的时候,Q就析构了。
在第二个主函数中,由于a没有初始化,该临时对象拷贝构造 a 后,就失去了任何作用,所以对于这种类型(只起拷贝构造另一个对象的作用)的临时对象,c++将其看做: A a(1); 即直接以相同参数构造目标对象,省略了创建临时对象这一步。所以就有这样的输出结果。
如果大家觉得有什么问题,欢迎探讨和指教,毕竟搞技术的想得越细越好,越深越好。