• 赋值操作符重载


    问题描述:

           为何C++中赋值操作符只能重载为成员函数?不能为普通函数或者友元函数!

     

    问题解决:

           1、不能重载为普通函数,是因为赋值操作会访问类的私有成员,而普通函数无法访问类的私有成员

           2、不能为友元函数,是因为友元函数没有this指针,友元函数的参数至少为两个,假定在类中声明如下的友元函数:

    friend assignment& operator=(assignment& a,const assignment& b)
       {
          a.v=b.v;
          return a;
       }

           那么可能会存在2=b;其中b为assignment对象,常数2 可以通过隐式类类型转换为assignment临时对象,然后调用上述友元函数,但是

    赋值操作要求左值为变量,2为一个常量,这样就会出现赋值操作的二义性,因而赋值操作只能重载为成员函数。

     

    考虑如下类:

    /**
    *    赋值操作符一般做为成员函数重载不能作为普通函数或者友元函数重载,为什么?
    *    
    */
    
    #include <iostream>
    using namespace std;
    
    
    class assignment
    {
    public:
        assignment()
        {
            cout<<"default"<<endl;
            v=0;
        }
    
        assignment(int v)
        {
            cout<<"param"<<endl;
            this->v=v;
        }
    
        assignment(const assignment& copy)
        {
            cout<<"copy"<<endl;
            this->v=copy.v;
        }
    
        assignment& operator=(const assignment& assign)
        {
            cout<<"assignment"<<endl;
    
            if (this==&assign)
                return *this;
    
            this->v=assign.v;
            return *this;
        }
    
        friend int fmethod(int a,const assignment& b);    //友元函数声明
    private:
        int v;
    };
    
    int fmethod(int a,const assignment& b)
    {
        return a+b.v;
    }
    
    int main()
    {
    
        //测试拷贝构造函数
        cout<<"=========测试拷贝构造函数========="<<endl;
        assignment default;
        assignment copy=default;
        cout<<endl;
    
        //测试赋值操作符重载
        cout<<"=========测试赋值操作符重载========="<<endl;
        copy=default;
        cout<<endl;
    
        //隐式类类型转换
        cout<<"=========隐式类类型转换=========="<<endl;
        copy=12;    //隐式类类型转换,调用assignment的含参数构造函数,将12转换为assignment临时对象
    
        cout<<"=========友元函数=========="<<endl;
        cout<<fmethod(3,copy)<<endl;
    }

    注:

                如上代码中,assignment default;    assignment copy=default;  调用拷贝构造函数

    copy=default;   调用赋值操作

  • 相关阅读:
    Spring Boot 配置加载顺序详解
    JVM总结篇
    nginx负载均衡的策略
    布隆过滤器的方式解决缓存穿透问题
    Spring Cloud Eureka自我保护机制(服务无法剔除)
    缓存穿透,缓存击穿,缓存雪崩解决方案分析
    高并发秒杀系统总结
    Linux环境进程间通信(一)
    HDU 1695 GCD(容斥定理)
    数据结构精要------冒泡与直接排序算法
  • 原文地址:https://www.cnblogs.com/luosongchao/p/3554322.html
Copyright © 2020-2023  润新知