龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++运算符重载赋值运算符[组图]

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注重的是,它与拷贝构造函数与析构函数一样,要注重深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况

     自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注重的是,它与拷贝构造函数与析构函数一样,要注重深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,假如没有指定默认的赋值运算符重载函数, <!-- frame contents -->
<!-- /frame contents --> 那么系统将会自动提供一个赋值运算符重载函数。
  
     赋值运算符重载函数的定义与其它运算符重载函数的定义是差不多的。
  
     下面我们以实例说明如何使用它,代码如下:
   //程序作者:管宁 
  //站点: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++技术专题专题,或
  
精彩图集

赞助商链接