| 订阅 | 在线投稿
分享
 
 
 

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

2008-06-01 02:04:49 编辑來源:互联网 国际版 评论
 
 
  自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注重的是,它与拷贝构造函数与析构函数一样,要注重深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,假如没有指定默认的赋值运算符重载函数,

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

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

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

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

  //程序作者:管宁

  //站点: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/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;就属于此种情况)。 [url=http://www.wangchao.net.cn/bbsdetail_1785322.html][img]http://image.wangchao.net.cn/it/1323423892205.gif[/img][/url] 更多内容请看C/C++技术专题专题,或
󰈣󰈤
日版宠物情人插曲《Winding Road》歌词

日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。 最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。 歌手:Def...

兄弟共妻,我成了他们夜里的美食

老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...

网络安全治理:国家安全保障的主要方向是打击犯罪,而不是处置和惩罚受害者

来源:中国青年报 新的攻击方法不断涌现,黑客几乎永远占据网络攻击的上风,我们不可能通过技术手段杜绝网络攻击。国家安全保障的主要方向是打击犯罪,而不是处置和惩罚...

 
 
 
>>返回首页<<
 为你推荐
 
 
 
 转载本文
 UBB代码 HTML代码
复制到剪贴板...
 
 
 热帖排行
 
单纯美女 迷人女孩
校园甜美少女
忍辱负重
大学校园
 
 
王朝网络微信公众号
微信扫码关注本站公众号wangchaonetcn
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
©2005- 王朝网络 版权所有