返回信息流#include <iostream>
using namespace std ;
class A
{
public:
A(int i = 0): data(i){cout<<"A constructor"<<endl ;}
A(const A& rhs)
{
data = rhs.data ;
cout<<"A copy constructor"<<endl ;
}
A& operator=(const A& rhs)
{
if(this!=&rhs)
{
data = rhs.data ;
}
cout<<"A copy assignment"<<endl ;
return *this ;
}
private:
int data ;
};
class B : public A
{
public:
B(int i = 0 ,int j = 0):A(i),dataB(j){ cout<<"B constructor"<<endl ;}
B(const B& rhs):A(rhs),dataB(rhs.dataB){ cout<<"B copy constructor"<<endl ;}
B& operator=(const B& rhs)
{
if(this!=&rhs)
{
dataB = rhs.dataB ;
A::operator=(rhs) ;
}
cout<<"B copy assignment"<<endl ;
return *this ;
}
private:
int dataB ;
};
void main()
{
B b ;
B c = b;
}
结果是
A constructor
B constructor
A copy constructor
B copy constructor
Press any key to continue
而
void main()
{
B b ;
B c ;
c = b ;
}
结果是
A constructor
B constructor
A constructor
B constructor
A copy assignment
B copy assignment
Press any key to continue
这是一条镜像帖。来源:北邮人论坛 / cpp / #6132同步于 2008/5/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
为什么这样?C++的机制实在太让人搞不懂了
maroon
2008/5/4镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
因为这时候在初始化啊,如果你写成:B c; c=b;就调用重载的操作符=
【 在 maroon (mumu) 的大作中提到: 】
: B c = b;
: 为什么不是调用复制operator=函数呢?
: 而是调用的拷贝构造函数
: ...................
【 在 maroon 的大作中提到: 】
: B c = b;
: 为什么不是调用复制operator=函数呢?
: 而是调用的拷贝构造函数
初始化时的等号调用复制构造函数来处理
B c = b;
与
B c(b);
等效
标准里做了上述规定
【 在 maroon 的大作中提到: 】
: B c = b;
: 为什么不是调用复制operator=函数呢?
: 而是调用的拷贝构造函数
这个问题换个角度来想也许更容易些,比如你在拷贝构造函数前面加个explicit看看会怎样
【 在 Quake 的大作中提到: 】
: 初始化时的等号调用复制构造函数来处理
: B c = b;
: 与
: ...................
哇,你对标准都很了解 ,牛啊