拷贝构造应用场合由以下几个方面:
1 参数是个对象并且是值传递方式
2 返回值是个对象并且是值传递方式
3 用个对象化另外个对象
由此当参数或者返回值为个对象时使用时候要小心值传递时候执行是位拷贝并不会对象构造也就是说生成临时对象可能不是正确化这样就可能会出现些意向不到问题当返回值是个对象和用个对象化另外个对象时情况是相同
比如如下代码:
# <iostream>
using std;
CTest
{
public:
i;
CTest{cout << "construct" << endl;}
~CTest{cout << "discontruct" << endl;}
};
void test(CTest obj)
{
}
{
CTest testObj;
test(testObj);
0;
}
这个运行结果为:
construct
discontruct
discontruct
了次构造了两次析构声明testObj对象时了次构造当testObj以值传递方式传入test时此时会生成个CTest类型临时变量但是此时编译器采用是位拷贝方式并不CTest类构造当test退出时生成临时变量生命周期结束次析构当退出时testObj变量生命周期结束次析构所以出现上面输出
正确解决思路方法是定义个拷贝构造
拷贝构造类型为:YourClass&(YourClass& object);
修改后代码为:
# <iostream>
using std;
CTest
{
public:
i;
CTest{cout << "construct" << endl;}
CTest(CTest& obj){cout << "call copy construct" << endl;} //拷贝构造
~CTest{cout << "discontruct" << endl;}
};
void test(CTest obj)
{
}
{
CTest testObj;
test(testObj);
0;
}
此时输出为:
construct
call copy construct
discontruct
discontruct
当用个对象化另外个对象时也对拷贝构造
如
CTest test1;
CTest test2 = test1; //test1拷贝构造化对象test2
但是对于下面表达式:
CTest test1,test2;
test2 = test1;
却不会CTest拷贝构造test2已经被化过了此时如果想要正确对test2赋值需要重载运算符=
运算符重载方式为 :
YourClass& operator=(YourClass& obj)
{
*this;
}
虽然不编写拷贝构造和重载运算符=在大部分情况下代码都能正常工作编译器会生成个默认拷贝构造并且在对象赋值时候也会作些特殊处理但是我们不能完全相信系统始终能正常理解你代码所以让代码完全在自己控制的下才是个好思路方法所以时刻不要忘记编写拷贝构造和重载=
最新评论