重载copy construct的问题~~ 急

block1956815 2004-09-17 08:55:12
考虑以下一个类的例子:
class Sample
{
public:
int m_n;
string m_str;
Sample(int mm):m_n(mm){cout<<"sample construct with "<<mm<<endl;};
virtual ~Sample();
virtual void print();
}
Sample a(1);
Sample b(2);
b = a; //通过
1 我想问在什么时候需要显示的重载operator = 和copy constructor???

第二个问题:
2 copy construct应该如何定义?
是这样 :
Sample Sample(Sample& sam);
还是:
Sample& Sample(Sample& sam);

如果这里返回的是引用 返回的是那个的引用??? 我对返回值为引用的情况不是很清楚 请哪位给解释一下
...全文
278 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
freshairfly 2004-09-17
  • 打赏
  • 举报
回复
呵呵,我这里只能上csdn和其它的一些开发类网站,msn、QQ都用不了
lmtz007yan 2004-09-17
  • 打赏
  • 举报
回复
很想和你们交个朋友!
我的MSN :lmtz007yan@hotmail.com
block1956815 2004-09-17
  • 打赏
  • 举报
回复
对了~~~是哈 怎么就忘了这个呢~~~
了解了~~~
lmtz007yan 2004-09-17
  • 打赏
  • 举报
回复
呵呵,应该说,默认的复制构造函数没有正确的处理!
对引用,const进行二次赋值肯定报错了!
freshairfly 2004-09-17
  • 打赏
  • 举报
回复
248406869(笨笨)
我没有英文版的,只有中文版的(翻译的不是很好,你也看到了)。
248406869 2004-09-17
  • 打赏
  • 举报
回复
freshairfly(菜鸟精神)
你有英文原版的effictive C++吗?能不能给我发一份。peng-zhang@netease.com
freshairfly 2004-09-17
  • 打赏
  • 举报
回复
引用和const必须在构造对象时候初始化,而默认的复制构造函数没有这些处理,所以报错了!
--------------------------------------
默认的复制构造函数不是没有处理,而是处理错了,它就是简单地对类的非静态数据成员进行 "以成员为单位的" 逐一拷贝构造(赋值)。
freshairfly 2004-09-17
  • 打赏
  • 举报
回复
to 楼上的:
effictive C++,电子chm版(我身边有候捷版),可以拷贝,呵呵
lmtz007yan 2004-09-17
  • 打赏
  • 举报
回复
类里有引用或者是const成员时,如果使用默认的编译器生成的拷贝构造函数和赋值操作符,编译器会报错。
---------------------------------
默认的复制构造函数是浅层复制,也就是说对于指针成员,复制构造函数不再为对象的这些成员分配内存,而是指向同一块内存!
引用和const必须在构造对象时候初始化,而默认的复制构造函数没有这些处理,所以报错了!

我的理解,请各位高手指正!
248406869 2004-09-17
  • 打赏
  • 举报
回复
freshairfly(菜鸟精神) 你看的哪本书呀,翻译的真烂。
freshairfly 2004-09-17
  • 打赏
  • 举报
回复
总结一下就是:
1、引用本身不能被修改,即“一旦引用已经定义它就不能再指向其他的对象”。
2、const变量不能被修改
freshairfly 2004-09-17
  • 打赏
  • 举报
回复
当你的类里有引用或者是const成员时,如果使用默认的编译器生成的拷贝构造函数和赋值操作符,编译器会报错。

可不可以解释一下这里? 不是很清楚~~~多谢
-------------------------------------------------------------
首先要明白:编译器的缺省拷贝构造函数(赋值运算符)对类的非静态数据成员进行 "以成员为单位的" 逐一拷贝构造(赋值)。

拷贝一个书上的例子你可能会更明白:
假设NamedObject象这样定义,nameValue是一个string的引用,objectValue是一个const T:

template<class T>
class NamedObject {
public:
// 这个构造函数不再有一个const名字参数,因为nameValue
// 现在是一个非const string的引用。char*构造函数
// 也不见了,因为引用要指向的是string
NamedObject(string& name, const T& value);

... // 同上,假设没有
// 声明operator=
private:
string& nameValue; // 现在是一个引用
const T objectValue; // 现在为const
};

现在看看下面将会发生什么:

string newDog("Persephone");
string oldDog("Satch");

NamedObject<int> p(newDog, 2); // 正在我写本书时,我们的
// 爱犬Persephone即将过
// 她的第二个生日

NamedObject<int> s(oldDog, 29); // 家犬Satch如果还活着,
// 会有29岁了(从我童年时算起)

p = s; // p中的数据成员将会发生
// 些什么呢?

赋值之前,p.nameValue指向某个string对象,s.nameValue也指向一个string,但并非同一个。赋值会给p.nameValue带来怎样的影响呢?赋值之后,p.nameValue应该指向 "被s.nameValue所指向的string" 吗,即,引用本身应该被修改吗?如果是这样,那太阳从西边出来了,因为C++没有办法让一个引用指向另一个不同的对象(参见条款M1)。或者,p.nameValue所指的string对象应该被修改吗? 这样的话,含有 "指向那个string的指针或引用" 的其它对象也会受影响,也就是说,和赋值没有直接关系的其它对象也会受影响。这是编译器生成的赋值运算符应该做的吗?

block1956815 2004-09-17
  • 打赏
  • 举报
回复
to freshairfly(菜鸟精神)
当你的类里有引用或者是const成员时,如果使用默认的编译器生成的拷贝构造函数和赋值操作符,编译器会报错。
----------------------------------------------------------------------------
可不可以解释一下这里? 不是很清楚~~~多谢
freshairfly 2004-09-17
  • 打赏
  • 举报
回复
晕,又写错了~~~~
Sample b = a; //调用的是copy constructor
如果
Sample a, b;
b = a;//这里才是operator=
block1956815 2004-09-17
  • 打赏
  • 举报
回复
当你的类里有引用或者是const成员时,如果使用默认的编译器生成的拷贝构造函数和赋值操作符,编译器会报错。

可不可以解释一下这里? 不是很清楚~~~多谢
freshairfly 2004-09-17
  • 打赏
  • 举报
回复
operator = 和copy constructor通常是一起重载的吧?
如果这个:
Sample b = a; //它调用的应该是= 还是copy construct? 或者是两个都有?
Sample b(a); 这个很明显是调用的copy construct的了....
---------------------------------
operator = 和copy constructor一般都是一起重载(呵呵,operator=是重载,copy constructor应该叫定义)。
Sample b = a; //调用的是operator=
248406869 2004-09-17
  • 打赏
  • 举报
回复
楼上的Sample b = a;是调拷贝构造函数。
block1956815 2004-09-17
  • 打赏
  • 举报
回复
to: freshairfly(菜鸟精神)
当你的类里有引用或者是const成员时,如果使用默认的编译器生成的拷贝构造函数和赋值操作符,编译器会报错。(原因你知道吧?)

多谢 但是这个不是很明白~~~
-----------------------------------------------------------------------------
operator = 和copy constructor通常是一起重载的吧?
如果这个:
Sample b = a; //它调用的应该是= 还是copy construct? 或者是两个都有?
Sample b(a); 这个很明显是调用的copy construct的了....

nkchief 2004-09-17
  • 打赏
  • 举报
回复
不要说得这么复杂了,内部含有指针时,重载
248406869 2004-09-17
  • 打赏
  • 举报
回复
一、重载的“=”在赋值表达式中使用。拷贝构造函数在对象初始化,函数调用时用。
二、构造函数没有返回值
加载更多回复(6)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧