首页
学习
活动
专区
圈层
工具
发布
30 篇文章
1
《挑战30天C++入门极限》C++的iostream标准库介绍(1)
2
《挑战30天C++入门极限》C++的iostream标准库介绍(2)
3
《挑战30天C++入门极限》C++的iostream标准库介绍(3)
4
《挑战30天C++入门极限》C++运算符重载赋值运算符
5
《挑战30天C++入门极限》C++运算符重载函数基础及其值返回状态
6
《挑战30天C++入门极限》对C++递增(增量)运算符重载的思考
7
《挑战30天C++入门极限》类的分解,抽象类与纯虚函数的需要性
8
《挑战30天C++入门极限》C++中利用构造函数与无名对象简化运算符重载函数
9
《挑战30天C++入门极限》C++中类的多态与虚函数的使用
10
《挑战30天C++入门极限》C++运算符重载转换运算符
11
《挑战30天C++入门极限》图例实解:C++中类的继承特性
12
《挑战30天C++入门极限》C++类的继承与多重继承的访问控制
13
《挑战30天C++入门极限》图文例解C++类的多重继承与虚拟继承
14
《挑战30天C++入门极限》理解C++面向对象程序设计中的抽象理论
15
《挑战30天C++入门极限》C++面向对象编程入门:构造函数与析构函数
16
《挑战30天C++入门极限》C++类对象的复制-拷贝构造函数
17
《挑战30天C++入门极限》C++类静态数据成员与类静态成员函数
18
《挑战30天C++入门极限》入门教程:实例详解C++友元
19
《挑战30天C++入门极限》C++面向对象编程入门:类(class)
20
《挑战30天C++入门极限》新手入门:C++中的函数重载
21
《挑战30天C++入门极限》新手入门:C/C++中的结构体
22
《挑战30天C++入门极限》C/C++中字符串常量的不相等性及字符串的Copy
23
《挑战30天C++入门极限》新手入门:C++中堆内存(heap)的概念和操作方法
24
《挑战30天C++入门极限》C/C++中字符指针数组及指向指针的指针的含义
25
《挑战30天C++入门极限》C/C++中结构体(struct)知识点强化
26
《挑战30天C++入门极限》新手入门:关于C++中的内联函数(inline)
27
《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)
28
《挑战30天C++入门极限》新手入门:C++中布尔类型
29
《挑战30天C++入门极限》新手入门:C/C++中数组和指针类型的关系
30
《挑战30天C++入门极限》新手入门:C++下的引用类型

《挑战30天C++入门极限》C++运算符重载赋值运算符

代码语言:javascript
复制






 

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




 




 











下一篇
举报
领券