C++运算符重载赋值运算符

王朝c/c++·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注重的是,它与拷贝构造函数与析构函数一样,要注重深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,假如没有指定默认的赋值运算符重载函数,

那么系统将会自动提供一个赋值运算符重载函数。

赋值运算符重载函数的定义与其它运算符重载函数的定义是差不多的。

下面我们以实例说明如何使用它,代码如下:

//程序作者:管宁

//站点: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;就属于此种情况)。

更多内容请看C/C++技术专题专题,或

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航