一.拷貝建構函式
先直接來看**:
#include
#include
"help.h"
using
namespace std;
class
line
private
:char
* _msg;};
line::
line
(const
char
*msg)
line::
line
(const line& line)
line::
~line()
void
display
(line &line)
void
situation1()
void
situation2()
void
situation3()
void
situation4()
intmain()
/*總結:
拷貝建構函式的基本形式為:
classname(const classname& obj){};
呼叫拷貝建構函式有以下四種情況:
1.classname obj1;
classname obj2 = obj1;
2.classname obj1;
classname obj2(obj1);
3.classname obj1;
classname *obj2 = new classname(obj1);//注意此處obj2指標需要自行delete,自行delete之後系統便會呼叫析構函式
4.classname obj1;
classname obj2 = classname(obj1);
5. t func()
從上述例子中可以看出,在呼叫拷貝建構函式時,都需要進行空間的申請。
那麼不用進行空間申請的拷貝呢?
*/
總結:
拷貝建構函式的基本形式為:
classname
(const classname& obj)
;
呼叫拷貝建構函式有以下四種情況:
1.
classname obj1;
classname obj2 = obj1;
classname obj1;
classname obj2
(obj1)
;
classname obj1;
classname *obj2 =
newclassname
(obj1)
;//注意此處obj2指標需要自行delete,自行delete之後系統便會呼叫析構函式
classname obj1;
classname obj2 =
classname
(obj1)
;
t func()
從上述例子中可以看出,在呼叫拷貝建構函式時,都需要進行空間的申請。
二.深拷貝與淺拷貝
理解了拷貝建構函式之後,搞懂深拷貝與淺拷貝也就是易如反掌的事情了。
淺拷貝:
呼叫預設的拷貝建構函式
深拷貝:
呼叫自己寫的拷貝建構函式
在一.拷貝建構函式中,用的都是深拷貝的方法,接下來看看用淺拷貝,也就是預設的拷貝建構函式會帶來哪些問題
#include
#include
"help.h"
using
namespace std;
class
line
private
:char
* _msg;};
line::
line
(const
char
*msg)
//淺拷貝建構函式
line::
line
(const line& line)
line::
~line()
void
display
(line &line)
intmain()
結果是系統在執行**錯,原因很簡單,看淺拷貝的**:
//淺拷貝建構函式
line::
line
(const line& line)
出錯原因是:line1和line2的_msg都指向了同一塊堆空間,但是在析構函式的過程中卻釋放了兩次空間,所以出錯! 拷貝建構函式淺拷貝深拷貝
1 函式的引數為類物件且引數採用值傳遞方式 2 將類物件做為函式的返回值。2.淺拷貝 所謂淺拷貝,指的是在物件複製時,只對物件中的資料成員進行簡單的賦值 預設拷貝建構函式執行的也是淺拷貝。大多情況下 淺拷貝 已經能很好地 工作了,但是一旦物件存在了動態成員,那麼淺拷貝就會出問題了,讓我們考慮如下一段...
拷貝建構函式,深拷貝,淺拷貝
深淺拷貝的區別 淺拷貝是將原始物件中的資料型字段拷貝到新物件中去,將引用型字段的 引用 複製到新物件中去,不把 引用的物件 複製進去,所以原始物件和新物件引用同一物件 新物件中的引用型字段發生變化會導致原始物件中的對應欄位也發生變化。line line const line obj 深拷貝是在引用方...
拷貝構造 深拷貝與淺拷貝
拷貝建構函式用乙個已有同類物件的資料對正在建立的物件進行資料初始化 c 為類提供預設版本的拷貝建構函式 預設複製建構函式可以完成物件的資料成員值簡單的複製 物件的資料資源是由指標指示的堆時,預設複製建構函式僅作指標值複製,即為淺拷貝 class teachert 顯示的提供乙個拷貝建構函式,來完成深...