专栏首页landv《挑战30天C++入门极限》C++运算符重载赋值运算符

《挑战30天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;就属于此种情况)。




 




 











本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Windows10右键添加“在此处打开命令窗口”

    landv
  • golang-结构体的使用

    landv
  • [php][thinkphp] 记一次Composer Linux版安装以及用它进行thinkphp项目初始化

    php中开启exec,system等函数调用系统命令 修改php.ini文件 关掉安全模式 safe_mode = off 然后在看看 禁用函数列表 disab...

    landv
  • 基于AngularJS的过滤与排序

    前面了解了AngularJS的使用方法,这里就简单的写个小程序,实现查询过滤以及排序的功能。 本程序中可以了解到:   1 angularjs的过滤器 ...

    用户1154259
  • 小米电视远程播放搭建

    directory_need_share,母机上需要共享的目录 user,samba登录用户名 pass,samba登录密码 samba_share,samba...

    RogerPu-普文俊
  • Python 中的神秘运算符

    今天我们来讲讲 Python 里一个不为众人所知的运算符。你可能会觉得疑惑:还有我不知道的运算符?别急着下结论,先往下看看再说。

    Crossin先生
  • 水题 成绩排序 (vector的练习)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • 20171023

    天天_哥
  • 【SEDA异步框架】【四】异步框架总体设计与实现

           前文提到,基于SEDA的异步框架,一个stage的理想结构描述如下:

    吃橙子的狐狸
  • hdu1038

    @坤的

扫码关注云+社区

领取腾讯云代金券