凌云窟
南山巅上火麟烈,北海潜深雪饮寒。可怜两锋未缘见,雪刀封隐孤剑鸣。
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

留言簿(0)

随笔分类

随笔档案

文章档案

相册

简历下载

搜索

最新评论

阅读排行榜

评论排行榜

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

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)。请大家在帮我分析下这个结论有问题不。
发表于 2006-08-11 14:34 莫问春秋 阅读(3476) | 评论 (6)编辑 收藏