📄 subject_47061.htm
字号:
<p>
序号:47061 发表者:zaibo 发表日期:2003-07-17 10:00:16
<br>主题:什么是拷贝构造函数
<br>内容:什么是拷贝构造函数呀?我正在看 钱能的《c++程序设计》p316<BR>看了即便还是不懂什么是拷贝构造函数!<BR>请各位大虾指教!<BR><BR>浅拷贝就是没有为对象分配堆空间,而深拷贝就是分配了对空间!(不知是否正确)<BR>浅拷贝、深拷贝怎么用?
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:么眉的 回复日期:2003-07-17 10:55:56
<br>内容:拷贝构造函数,经常被称作X(X&),是一种特殊的构造函数,他由编译器调用来完成一些基于同一类的其他对象的构件及初始化。它的唯一的一个参数(对象的引用)是不可变的(因为是const型的)。这个函数经常用在函数调用期间于用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。<BR> 在C++中,下面三种对象需要拷贝的情况。因此,拷贝构造函数将会被调用。<BR> 1). 一个对象以值传递的方式传入函数体<BR> 2). 一个对象以值传递的方式从函数返回<BR> 3). 一个对象需要通过另外一个对象进行初始化<BR> 以上的情况需要拷贝构造函数的调用。如果在前两种情况不使用拷贝构造函数的时候,就会导致一个指针指向已经被删除的内存空间。对于第三种情况来说,初始化和赋值的不同含义是构造函数调用的原因。事实上,拷贝构造函数是由普通构造函数和赋值操作赋共同实现的。描述拷贝构造函数和赋值运算符的异同的参考资料有很多。<BR> 拷贝构造函数不可以改变它所引用的对象,其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环。<BR> 除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。换句话说,你从函数返回得到的只是对象的一份拷贝。但是同样的,拷贝构造函数被正确的调用了,你不必担心。<BR> 如果在类中没有显式的声明一个拷贝构造函数,那么,编译器会私下里为你制定一个函数来进行对象之间的位拷贝(bitwise copy)。这个隐含的拷贝构造函数简单的关联了所有的类成员。许多作者都会提及这个默认的拷贝构造函数。注意到这个隐式的拷贝构造函数和显式声明的拷贝构造函数的不同在于对于成员的关联方式。显式声明的拷贝构造函数关联的只是被实例化的类成员的缺省构造函数除非另外一个构造函数在类初始化或者在构造列表的时候被调用。<BR> 拷贝构造函数是程序更加有效率,因为它不用再构造一个对象的时候改变构造函数的参数列表。设计拷贝构造函数是一个良好的风格,即使是编译系统提供的帮助你申请内存默认拷贝构造函数。事实上,默认拷贝构造函数可以应付许多情况。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:么眉的 回复日期:2003-07-17 11:10:53
<br>内容:我觉得浅拷贝就是所谓的位逐次拷贝<BR>深拷贝就是有成员对象存在等时候,进行的拷贝吧<BR>String::String(const String& s)<BR>{<BR> len=s.len;<BR> str=s.str;<BR>}<BR>这个就是浅拷贝<BR><BR>String::String(const String& s)<BR>{<BR> len=s.len;<BR> str=new char(len+1);<BR> strcpy(str,s.str);<BR><BR>}这个就是深拷贝<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -