理解 operator=

原创 2007年10月01日 17:58:00

    前几天有人在水源C版提出这样一个问题.先是代码如下;

#include <iostream>
using namespace std;
class Base
{
public :
    Base
& operator=(const Base &a)
    
{
        cout
<<"Base ="<<endl;
        
return *this;
    }

}
;
class Devide:public Base
{
public :
    Devide
& operator=(const Base& a)
    
{
        cout
<<"Devide ="<<endl;
        
return *this;
    }

}
;
int main()
{
    Devide a,b;
    a 
= b;
    
return 0;
}

 提问的人写下这段代码,原意是想让发生在 a=b上的=运算符重载调用Devide类的operator=. 不料却调用了父类的operator= .  有人提出将Devide& operator=(const Base& a) 改为 Devide& operator=(const Devide& a)后 .问题立刻得到解决.  不过问题继续是:为何原来子类里的OPERATOR=没能将父类中的同名函数覆盖.

对这个问题完整的解答如下:

    classname::operator=(classname &)是一个特殊的操作符重载函数,C++标准规定:缺省构造函数,拷贝构造函数,拷贝赋值函数,以及析构函数这四种成员函数被称作特殊的成员函数.当类中没有显示定义这几个函数时,编译器将为类添加这几个函数.  提问者在子类中写下的Devide& operator=(const Base& a) 并没有被编译器承认为是一个合法的拷贝构造函数,因而编译器自行添加了Devide& operator=(const Devide& a),在这个函数里,又调用了父类的拷贝构造函数.这也就解释了提问者提出的第一个问题. 当我们显式的定义了拷贝构造函数后,就不用再到父类里去走一遭了.


另一个问题:OPERATOR=的继承性

  这个问题是在网上搜到的;问题代码如下:

额外的注释:C++标准规定:如果派生类中声明的成员与基类的成员同名,那么,基类的成员会被覆盖,哪怕基类的成员与派生类的成员的数据类型和参数个数都完全不同。

 

 

class A1
{
public:
        
int operator=(int a)
        
{
                
return 8;
        }


        
int operator+(int a)
        
{
                
return 9;
        }

}
;

class B1 : public A1
{
public:
        
int operator-(int a)
        
{
                
return 7;
        }

}
;

int main()
{        
        B1 v;
        cout 
<< (v + 2<< endl; // OK, print 9
        cout << (v - 2<< endl; // OK, print 7
        cout << (v = 2<< endl; // Error, see below

        
return 0;
}

VC编译器的错误提示:
error C2679: binary '=' : no operator defined which takes a right-and operand of type 'const int' (or there is no acceptable conversion)

在这个例子中,OPERATOR=并非我们上面提到的拷贝赋值函数.只是普通的对=运算符的重载.问题在于子类并没有继承父类中的这个函数.重载OPERATOR+=,该程序可以成功运行.说明子类继承了OPERATOR+=.为什么+=可以被成功继承而=不行呢.假设OPERATOR=可以被正常继承,而根据我们前面的描述,编译器默默地在子类中添加了B1::operator=(B1 &)这样一个成员.根据C++标准,子类中于父类同一名称的函数,不管参数列表如何不同,都实行覆盖.从而我们继承来的OPERATOR=被编译器自动添加的COPY ASSIGNMENT OPERATOR覆盖了.而+=不存在这样的问题,继承得以正常的进行.

相关文章推荐

C++那些细节--中operator=相关问题

C++中关于operator=的相关知识整理,涉及深拷贝浅拷贝,以及一些拷贝构造函数的知识...

operator关键字(重载操作符)

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。  这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解: 一方面要使...

理解operator HBRUSH( ) const的实现原理

问题引出 在MFC中有个WM_CTLCOLOR消息,它的消息响应函数是CWnd类的OnCtlColor,其函数声明和注释如下: afx_msg HBRUSH OnCtlColor( CDC* pD...

matrix simple operator

  • 2014年03月19日 17:20
  • 9KB
  • 下载

operator theory

  • 2015年10月23日 13:33
  • 17.91MB
  • 下载

【C++语法】关于operator[]重载的注意点

一个类重载operator[]()函数时,要重载operator[]两次,一个是const函数,一个是非const函数。...
  • cly116
  • cly116
  • 2015年08月06日 23:02
  • 751

PSSu E F 4DO_operator manual

  • 2015年06月04日 09:46
  • 1.96MB
  • 下载

PSSu E F 4DI_operator manual

  • 2015年06月04日 09:43
  • 1.92MB
  • 下载

实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中判断不等于end())、operator[])

遍历一个vector容器有很多种方法,使用起来也是仁者见仁。通过索引遍历:for (i = 0; i...

Zigbee Operator V1.0.0.137

  • 2012年09月16日 18:02
  • 2.67MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解 operator=
举报原因:
原因补充:

(最多只允许输入30个字)