C++运算符重载赋值运算符
自界说类的赋值运算符重载函数的浸染与内置赋值运算符的浸染雷同,可是要要留意的是,它与拷贝结构函数与析构函数一样,要留意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的环境下,假如没有指定默认的赋值运算符重载函数,那么系统将会自动提供一个赋值运算符重载函数。
赋值运算符重载函数的界说与其它运算符重载函数的界说是差不多的。
下面我们以实例说明如何利用它,代码如下:
//措施作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
using namespace std;
class Internet
{
public:
Internet(char *name,char *url)
{
Internet::name = new char[strlen(name)+1];
Internet::url = new char[strlen(url)+1];
if(name)
{
strcpy(Internet::name,name);
}
if(url)
{
strcpy(Internet::url,url);
}
}
Internet(Internet &temp)
{
Internet::name=new char[strlen(temp.name)+1];
Internet::url=new char[strlen(temp.url)+1];
if(name)
{
strcpy(Internet::name,temp.name);
}
if(url)
{
strcpy(Internet::url,temp.url);
}
}
~Internet()
{
delete[] name;
delete[] url;
}
Internet& operator =(Internet &temp)//赋值运算符重载函数
{
delete[] this->name;
delete[] this->url;
this->name = new char[strlen(temp.name)+1];
this->url = new char[strlen(temp.url)+1];
if(this->name)
{
strcpy(this->name,temp.name);
}
if(this->url)
{
strcpy(this->url,temp.url);
}
return *this;
}
public:
char *name;
char *url;
};
int main()
{
Internet a("中国软件开拓尝试室","www.cndev-lab.com");
Internet b = a;//b工具还不存在,所以挪用拷贝结构函数,举办结构处理惩罚。
cout<<b.name<<endl<<b.url<<endl;
Internet c("美国在线","www.aol.com");
b = c;//b工具已经存在,所以系统选择赋值运算符重载函数处理惩罚。
cout<<b.name<<endl<<b.url<<endl;
system("pause");
}
上例代码中的Internet& operator =(Internet &temp)就是赋值运算符重载函数的界说,内部需要先delete的指针就是涉及深拷贝问题的处所,由于b工具已经结构过,name和url指针的范畴已经确定,所以在复制新内容进去之前必需把堆区排除,区域的过大和过小都欠好,所以跟在后头从头分派堆区巨细,尔后举办复制事情。
在类工具还未存在的环境下,赋值进程是通过拷贝结构函数举办结构处理惩罚(代码中的Internet b = a;就是这种环境),但当工具已经存在,那么赋值进程就是通过赋值运算符重载函数处理惩罚(例子中的b = c;就属于此种环境)。