zoukankan      html  css  js  c++  java
  • 《挑战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;就属于此种情况)。

     
     
  • 相关阅读:
    【语言处理与Python】11.3数据采集
    【语言处理与Python】11.4使用XML\11.5使用Toolbox数据
    【语言处理与Python】11.1语料库结构:一个案例研究\11.2语料库生命周期
    【语言处理与Python】10.5段落语义层
    CentOS7.4 删除virbr0虚拟网卡
    套接字超时设置
    Linux命令进制转换、大小写转化
    网络编程第一卷读书笔记(随手记)
    linux下tcp选项TCP_DEFER_ACCEPT研究记录
    Cannot assign requested address出现的原因及解决方案
  • 原文地址:https://www.cnblogs.com/landv/p/11184934.html
Copyright © 2011-2022 走看看