凌云窟
南山巅上火麟烈,北海潜深雪饮寒。可怜两锋未缘见,雪刀封隐孤剑鸣。
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

留言簿(0)

随笔分类

随笔档案

文章档案

相册

简历下载

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-22 文章-0 评论-38 Trackbacks-0

An assignment operator shall be implemented by a non-static member function with exactly one parameter.Because a copy assignment operator operator= is implicitly declared for a class if not declared by the user ,a base class assignment operator is always hidden by the copy assignment operator of the derived class.
                                                --- 摘自 [ANSI-C++ 1998 Standard]

下面有一段代码:

class Base 
{
public:
    
void operator =(const Base & right)
    
{
        cout
<<"Base's  operator ="<<endl;
    }

}
;

class Derd:public Base
{
public:
    
void operator =(const Base & right)
    
{
        cout
<<"Derd's operator ="<<endl;
    }


}
;

int main(int argc, char* argv[])
{
    Derd lDerd;
    Derd rDerd;
    lDerd 
= rDerd;
    
return 0;
}

这段代码的结果是:
Base's operator =
按照C++标准的说明,基类的operator =应该被hidden了,可是这里为什么还是这个结果?察看汇编代码发现,实际上Base的operator=间接的在派生类的implicitly-declared Derd::operator=中被调用。问题就来了,我明明已经在派生类中自己声明了一个operator=的啊!我翻看了一些资料,都说在你自己不声明任何复制赋值操作符的时候,编译器会为你隐式生成一个,可是这儿我已经声明了一个,为什么编译器还要声明复制赋值操作符?  
    在几位兄台的提点下,我仔细了搜索了下C++标准,查找了相关内容。我的错误大概是我没搞清楚复制赋值操作符的声明形式,A user-declared copy assignment operator X::operator= is a non-static non-template member function of class X with exactly one parameter of type X, X&, const X&, volatile X& or const volatile X&。从这一点来看,void operator =(const Base & right)根本不是Derd的复制赋值操作符,所以编译器隐式声明了一个void operator =(const Derd & right)。请大家在帮我分析下这个结论有问题不。
posted on 2006-08-11 14:34 莫问春秋 阅读(3330) 评论(6)  编辑 收藏
Comments
  • # void operator =(const Base & right)
    jzhang
    Posted @ 2006-08-11 15:39
    应该是
    void operator =(const Derd& right)
  • # re: 关于operator=的一点疑问?
    莫问春秋
    Posted @ 2006-08-11 15:59
    to jzhang:
    你的意思是void operator =(const Base & right)不是Derd的
    copy assignment operator???
  • # re: 关于operator=的一点疑问?
    小明
    Posted @ 2006-08-11 16:35
    lDerd = rDerd;

    call 
    operator = (const Derd & ) ( 编译器生成的)

    call
    Base :: operator = (const Base & )
  • # re: 关于operator=的一点疑问?
    周星星
    Posted @ 2006-08-14 09:21
    Derd& operator=( const Derd& )
  • # to 周星星
    莫问春秋
    Posted @ 2006-08-15 08:49
    标准里好像并没有硬性要求必须返回Derd& ,只是好像在现实情况中存在A=(B=C)这种情况,所以一般要返回一个Derd&? 对不??
  • # re 莫问春秋:
    周星星
    Posted @ 2006-08-15 10:06
    无论是推荐使用的格式,还是默认使用的格式,都返回自身。
    当然C++不以返回类型来区分函数,所以当然可以写成其他格式,但这样的意义何在?
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]