理解 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=的相关知识整理,涉及深拷贝浅拷贝,以及一些拷贝构造函数的知识...
  • puppet_master
  • puppet_master
  • 2015年07月23日 14:09
  • 5998

C++学习 operator两种用法详解

转换函数的名称是类型转换的目标类型,因此,不必再为它指定返回值类型;转换函数是被用于本类型的数值或变量转换为其他的类型,也不必带参数   在写这篇文章之前,让我们先回顾一下编译器通过匹配过程确...
  • skdkjxy
  • skdkjxy
  • 2015年05月20日 16:56
  • 6688

请谨慎实现operator==操作符函数

请谨慎实现operator==操作符函数在c++中,==操作符是很有用的,但是它的实现也并非想象中的那样容易。本文将围绕一个简单的c++例子程序展开讨论,以便寻求一个简单的解决方法。在开始讲述等于操作...
  • hello_wyq
  • hello_wyq
  • 2007年02月06日 10:01
  • 3065

operator=函数.

首先讲一下为什么要写operator=函数.这是一个不得不解决而又容易忽视的问题!当我们写一个类的时候, 正常情况下不需要为该类重载=运算符, 因为系统为每个类提供了默认的赋值运算符, 该操作会把这个...
  • howlet2
  • howlet2
  • 2009年12月28日 14:02
  • 20867

operator关键字(重载操作符)

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

C++ 操作符重载 operator = 、operator <

正常情况下我们不能对两个Class进行 = 、 这里有一个 类 person ,我们对这个类进行 = 、...
  • huzhigenlaohu
  • huzhigenlaohu
  • 2014年09月29日 22:34
  • 2103

operator=为什么要返回一个reference to *this

一、 函数返回值 说到operator=的返回值,那么先必须要说一下函数的返回值。函数的返回值用于初始化在调用函数处创建的临时对象。 1、 返回引用类型             Test Fun(...
  • nodeathphoenix
  • nodeathphoenix
  • 2014年07月26日 17:13
  • 3084

让operator=返回*this的引用

  让operator=返回*this的引用 c++的设计者bjarne stroustrup下了很大的功夫想使用户自定义类型尽可能地和固定类型的工作方式相似。这就是为什么你可以重载运算符,写类型...
  • qwer_boo
  • qwer_boo
  • 2010年12月05日 19:07
  • 8295

继承和多态 2.0 -- 继承的六个默认成员函数

子类的构造函数 拷贝构造函数 赋值运算符的重载 析构函数
  • Neil4
  • Neil4
  • 2017年09月18日 17:36
  • 281

为什么C++赋值运算符重载函数不能被继承?

原文地址:http://blog.csdn.net/pbmichael/article/details/1608250 这个问题曾经困扰过我一阵子。请先看一下下面的源代码: class A1 ...
  • WUYUAN2011WOAINI
  • WUYUAN2011WOAINI
  • 2013年07月22日 13:38
  • 6418
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解 operator=
举报原因:
原因补充:

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