拷贝结构函数和运算符重载
副标题#e#
拷贝结构函数应用的场所由以下几个方面:
1 函数的参数是一个工具,而且是值通报方法
2 函数的返回值是一个工具,而且是值通报方法
3 用一个工具初始化别的一个工具
由此,当函数的参数可能返回值为一个工具时,利用的时候要小心,因为值通报的时候执行的是位拷贝,并不会挪用工具的结构函数,也就是说生成的姑且工具大概不是正确初始化的,这样就大概会呈现一些意向不到的问题。当返回值是个工具和用一个工具初始化别的一个工具时的环境是沟通的。
好比如下代码:
#include <iostream>
using namespace std;
class CTest
{
public:
int i;
CTest(){cout << "construct" << endl;}
~CTest(){cout << "discontruct" << endl;}
};
void test(CTest obj)
{
}
int main()
{
CTest testObj;
test(testObj);
return 0;
}
这个措施运行的功效为:
construct
discontruct
discontruct
#p#副标题#e#
挪用了一次结构函数,挪用了两次析构函数。声明testObj工具时,挪用了一次结构函数。当testObj以值通报的方法传入test函数时,此时会生成一个CTest范例的姑且变量,可是此时编译器回收的是位拷贝的方法,并不挪用CTest类的结构函数。当test函数退出时,生成的姑且变量生命周期竣事,挪用一次析构函数,当main函数退出时,testObj变量生命周期竣事,挪用一次析构函数。所以呈现上面的输出。
正确的办理要领是界说一个拷贝结构函数。
拷贝结构函数的范例为:YourClass&(YourClass& object);
修改后的代码为:
#include <iostream>
using namespace std;
class CTest
{
public:
int i;
CTest(){cout << "construct" << endl;}
CTest(CTest& obj){cout << "call copy construct" << endl;} //拷贝结构函数
~CTest(){cout << "discontruct" << endl;}
};
void test(CTest obj)
{
}
int main()
{
CTest testObj;
test(testObj);
return 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)
{
return *this;
}
固然不编写拷贝结构函数和重载运算符=,在大部门的环境下代码都能正常事情,因为编译器会生成一个默认的拷贝结构函数而且在工具赋值的时候也会作些非凡处理惩罚。可是我们不能完全相信系统始终能正常领略你的代码。所以让代码完全在本身的节制之下才是一个好的要领。所以时刻不要健忘编写拷贝结构函数和重载。