**中的mystring
類包含乙個指標成員,他指向動態分配的記憶體。複製這個類的物件時,將複製其指標成員,但不會複製指標指向的緩衝區,其結果會造成兩個物件指向同一塊記憶體區,這稱為淺複製,會威脅程式的穩定性。
#include
using
namespace std;
class
mystring
else}~
mystring()
}int
getlnegth()
const
char
*getstring()
};void
usestring
(mystring s)
intmain()
複製建構函式在物件被複製(包括物件按值傳遞給函式)時被編譯器呼叫。
申明語法如下:
#include
using
namespace std;
class
mystring
else
}mystring
(const mystring& copysource)
else}~
mystring()
}int
getlnegth()
const
char
*getstring()
};void
usestring
(mystring s)
intmain()
輸出:buffer points to :
0x013d9e20
複製構造函式呼叫
buffer points to :
0x013d9520
12this is string one
析構函式呼叫
析構函式呼叫
請按任意鍵繼續.
..
兩個buffer
的位址分別是0x013d9e20
和0x013d9520
,確認是深複製。
類包含原始指標成員時,務必編寫複製建構函式和複製賦值運算子;
編寫複製建構函式時,務必接受源物件的引數申明為const引用;
在需要多次呼叫複製建構函式來傳值時,編譯器嚴格呼叫複製建構函式反而降低了效能,為了避免這種效能瓶頸,可使用移動建構函式,語法如下:
mystring (mystring && movesource)
}
通過私有的複製建構函式,確保類物件不能作為引數被複製,只需將函式宣告為私有的,無需實現。
class
present
私有建構函式,私有賦值運算子,靜態例項成員
#include
# include
using
namespace std;
class
present
;present
(const present&);
const present&
operator=(
const present&);
string name;
public
:static present&
getinstantance()
string getname()
void
stename
(string s)};
intmain()
C 筆記 建構函式與析構函式
建構函式 宣告類的物件時,該類的建構函式會自動被呼叫 作用 建構函式是用於初始化類的成員變數 析構函式 在類物件被銷毀時,自動呼叫,呼叫順序與建構函式相反 作用 做善後清理工作 class person person person person person const string name,co...
c 建構函式與析構函式
一 建構函式 c 提供建構函式來處理物件的初始化,建構函式是一種特殊的成員函式,與其他的成員函式不同,不需要使用者來呼叫他,而是在建立物件時自動執行。它的特點是 函式名和類名相同,沒有返回值,可以過載 如果程式中未宣告,則系統自動產生出乙個預設的建構函式,預設的建構函式時不帶引數的。比如 stude...
C 建構函式與析構函式
c 規定,每個類必須有預設的建構函式,沒有建構函式就不能建立物件。若沒有提供任何建構函式,那麼c 提供自動提供乙個預設的建構函式,該預設建構函式是乙個沒有引數的建構函式,它僅僅負責建立物件而不做任何賦值操作。只要類中提供了任意乙個建構函式,那麼c 就不再自動提供預設建構函式。類物件的定義和變數的定義...