拷贝构造情况
==调用了拷贝构造就不调构造==
在什么情况下系统会调用拷贝构造函数:(三种情况)
(1)用类的一个对象去初始化另一个对象时
(2)当函数的形参是类的对象时(也就是值传递时),==如果是引用传递则不会调用==
(3)当函数的返回值是类的对象或==引用时==
#include <iostream>
using namespace std;
class A
{
private:
int a;
public:
A(int i){a=i;} //内联的构造函数
A(A &aa);
int geta(){return a;}
};
A::A(A &aa) //拷贝构造函数
{
a=aa.a;
cout<<"拷贝构造函数执行!"<<endl;
}
int get_a(A aa) //参数是对象,是值传递,会调用拷贝构造函数
{
return aa.geta();
}
int get_a_1(A &aa) //如果参数是引用类型,本身就是引用传递,所以不会调用拷贝构造函数
{
return aa.geta();
}
A get_A() //返回值是对象类型,会调用拷贝构造函数。会调用拷贝构造函数,因为函数体内生成的对象aa是临时的,离开这个函数就消失了。所有会调用拷贝构造函数复制一份。
{
A aa(1);
return aa;
}
A& get_A_1() //会调用拷贝构造函数,因为函数体内生成的对象aa是临时的,离开这个函数就消失了。所有会调用拷贝构造函数复制一份。
{
A aa(1);
return aa;
}
int _tmain(int argc, _TCHAR* argv[])
{
A a1(1);
A b1(a1); //用a1初始化b1,调用拷贝构造函数
A c1=a1; //用a1初始化c1,调用拷贝构造函数
int i=get_a(a1); //函数形参是类的对象,调用拷贝构造函数
int j=get_a_1(a1); //函数形参类型是引用,不调用拷贝构造函数
A d1=get_A(); //调用拷贝构造函数
A e1=get_A_1(); //调用拷贝构造函数
return 0;
}