拷贝构造函数应用的三种情况:
(1)对象初始化对象。
(2)函数的参数是一个对象,则调用这个函数时要调用拷贝构造函数。
(3)当函数的返回值是定义的类的对象时,函数执行完后返回调用者时调用拷贝构造函数。
上面的三点如果难以理解,下面我具体的举了几个例子。
1.对象初始化对象:
#include <iostream>
using namespace std;
class Test
{
public:
Test(int d = 0)
{
cout<<"create a new object"<<this<<endl;
data = d;
}
Test(const Test &t)
{
data = t.data;
cout<<"copy create a new object"<<this<<endl;
}
private:
int data;
};
int mai(int argc, char **argv)
{
Test t1(10);
Test t2(t1); //用对象t1初始化对象t2,这里需调用拷贝构造函数
return 0;
}
2.函数的参数是一个对象,则调用这个函数时要调用拷贝构造函数:
#include <iostream>
using namespace std;
class Test
{
public:
Test(int d = 0)
{
cout<<"create a new object"<<this<<endl;
data = d;
}
Test(const Test &t)
{
data = t.data;
cout<<"copy create a new object"<<this<<endl;
}
int get_data()
{
return data;
}
private:
int data;
};
void fun(Test x)
{
int value;
value = x.get_data();
cout<<value<<endl;
}
int main(int argc, char **argv)
{
Test t1(10);
Test t2(t1);
fun(t2); //函数的参数是一个对象,则调用这个函数时要调用拷贝构造函数:
return 0;
}
上面的这个例子调用了两次拷贝构造函数
3.当函数的返回值是定义的类的对象时,函数执行完后返回调用者时调用拷贝构造函数:
Test fun()
{
Test tmp(20);
return tmp; //这里会调用拷贝构造函数
}
int main()
{
Test t1(10);
Test t2(t1);
t2 = fun();
cout<<t2.get_data()<<endl;
}