作者legnaleurc (CA)
看板C_and_CPP
标题Re: [问题] copy constructor的问题
时间Mon Mar 16 22:59:17 2009
※ 引述《tstanly ()》之铭言:
: 有点搞不太懂copy construtor的用途
: 我知道的大概是
: 物件传给函数时 会复制一个物件
: 而有可能因为改变此复制物件(ex:delete)时 而改变了原本物件
: 应该是降对吧...?
主要是为了防止非预期的 shallow copy
实现正确的copy语意
预知详情请google
: 以下是一个范例
: 上面程式码没有使用copy constructor
: 而下面程式码有
: 不懂的是为什麽第一个程式码印出
: 1 2
: 0 4072544
: 而加了copy constructor可以解决此问题
因为你着了 shallow copy 的道
: int getval(myclass o)
: {
: return *o.p;
: }
注意这里是 call by value
会呼叫 copy ctor
: int main(int argc, char *argv[])
: {
: myclass a(1),b(2);
: cout<<getval(a)<<" "<<getval(b);
这里b传进getval建立了一个复本,假设叫bb
预设复制行为是bb.p = b.p
return之後bb被回收,发动dtor
bb.p被delete,同时意味着b.p指向的空间被delete
: cout<<"\n";
: cout<<getval(a)<<" "<<getval(b);
所以这里的getval会拿到烂掉的指标
: system("pause");
: return 0;
: }
: output:
: 1 2
: 0 4072544
: //copy construtor
: myclass::myclass(const myclass &o)
: {
: p=new int;
: if(!p){
: cout<<"allocation error\n";
: exit(1);
: }
: *p=*o.p;
: }
注意这里要做证同测试
另外operator =也要同时overload
否则还是有机会出错
--
自High笔记(半荒废)
http://legnaleurc.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.127.21.174
※ 编辑: legnaleurc 来自: 59.127.21.174 (03/16 23:00)
1F:推 tstanly:谢谢! 03/16 23:05
2F:→ legnaleurc:sorry,只有operator =才要证同测试 =.= 我错了 03/16 23:16
3F:推 chrisdar:四天王 预设建构子 拷贝建构子 拷贝运算子 解构子 03/16 23:29
4F:推 saxontai:当 data members 里有 pointer 时就是要很小心... 囧 03/16 23:31