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

  • 相关阅读:
    Centos 下查看服务器CPU的信息
    网速的一些知识整理
    如何复制文件夹里面的全部内容? 在pc上
    DataGridView中CellClick的使用,选中一行触发的动作可以在这个方法里执行
    C# 文件的压缩与解压缩
    C#调用Exe 及 有参数的
    oracle提示 ORA12154: TNS: 无法解析指定的连接标识符 OCIEnvCreate 失败, 返回代码为1,但错误消息文本不可用
    C# 导出wps配置服务器 注意事项
    C# FTP 操作类
    组件服务问题
  • 原文地址:https://www.cnblogs.com/luosongchao/p/3554322.html
Copyright © 2011-2022 走看看