《挑战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 条评论
登录 后参与评论

相关文章

来自专栏happyJared

this 和 super 关键字总结

this 关键字是可选的,这意味着,上面的示例可以不显式使用此关键字,但是,使用此关键字可能会使代码更易读和易懂。

10630
来自专栏Deep learning进阶路

3-1 栈 及其 C++实现

由于栈是运算受限的线性表,所以线性表的存储结构:顺序存储 和 链式存储 都对栈适用。

10740
来自专栏大龄程序员的人工智能之路

[C++11札记]: std::function

在C/C++中函数指针作为一种回调机制被广泛使用,但是函数指针在C++面向对象编程中有些不足,比如无法捕捉上下文。举个例子,使用对象的非静态成员函数作为函数指针...

14320
来自专栏前端加油站

angular4实战(1) angular-cli

版权声明:本文为博主原创文章,未经博主允许不得转载。 ...

7320
来自专栏北风IT之路

java8实战读书笔记:数值流、Stream创建与Optional类的使用

不知大家还记不得,在介绍函数式编程接口中为了避免基础数据类型的装箱/拆箱带来的性能损耗,特意为函数式接口引入了基础数据类型的函数式编程接口,例如IntPredi...

10520
来自专栏happyJared

final 和 static 关键字总结

7520
来自专栏前端加油站

node.js 学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 ...

7210
来自专栏转行程序员

Java和Python哪个更适合初学者的问题

我个人不是很喜欢讨论这个问题,为什么呢,每个人都学习能力不一样,你要是不行,哪个对于你也不简单。

8950
来自专栏呼延

Java8 接口的静态方法和默认方法

java8的接口中可以有default方法及static方法。 普通的抽象方法不可以有实现,实现此接口的类必须实现所有抽象方法。 默认方法必须有实现,实现此...

32250
来自专栏Deep learning进阶路

2-1 线性表之顺序表 及其C语言实现

④Locate(L,x):定位,对给定值x,若线性表中存在某个元素等于x,返回其索引号i;若存在多个元素等于x,返回最小的索引 i;若不存在,返回False

46830

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励