zoukankan      html  css  js  c++  java
  • 赋值操作符重载

    问题描述:

           为何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;   调用赋值操作

  • 相关阅读:
    阿里高级技术专家谈开源DDD框架:COLA4.0,分离架构和组件
    react的setState到底是同步还是异步?
    JMeter入门教程
    手把手教你接口自动化测试 – SoapUI & Groovy
    解读Web应用程序安全性问题的本质
    python实现的json数据以HTTP GET,POST,PUT,DELETE方式页面请求
    Linux常用命令
    PV原语操作详解
    软考计算机网络原理之IP计算问题汇总
    化繁为简了解进程与线程
  • 原文地址:https://www.cnblogs.com/luosongchao/p/3554322.html
Copyright © 2011-2022 走看看