c 建構函式和析構函式

2021-07-02 02:35:02 字數 1927 閱讀 5246

1.c++的建構函式有預設建構函式,一般的建構函式,賦值建構函式,拷貝建構函式(複製建構函式),強制型別轉化建構函式。

2.如果沒有定義建構函式和析構函式,則c++編譯器會按照「位拷貝」的方式提供預設的建構函式(不初始化),預設的賦值建構函式(淺賦值),預設的拷貝建構函式(淺拷貝),預設的析構函式。位拷貝要小心指標,靜態資料成員。

class string

; 3.例如如下的string類的兩個物件stra和strb,stra =」windows」,strb = 「linux」,如果沒有進行深賦值,將strb賦值給stra即執行stra = strb,則stra.m_data和strb.m_data指向同一塊記憶體區域,雖然stra.m_data的值變為linux,但這樣會造成以下問題:

①stra.m_data原來指向的記憶體區域未被釋放,會造成記憶體洩漏。

②stra.m_data和strb.m_data指向同一塊記憶體區域,任何一方的改變都會影響另一方。

③當物件析構時strb.m_data所指向的區域會被釋放兩次(可能會造成懸掛指標)。

正確的拷貝建構函式書寫如下:

string::string(const

char *str)

else

} /*析構函式*/

string::~string(void)

string::string(const string &other)

/*賦值建構函式*/

string & string::operator=(const string &other)

/*判斷是否相等*/

bool string::operator==(const string &str)

ostream &string:: operator

<<(ostream &o,const string &str)

4.拷貝建構函式的使用場景:

①物件以值傳遞的方式傳入函式引數

void

fun(string s)

fun(test);

test物件傳入形參時,會產生乙個臨時變數,假設為s,然後呼叫拷貝建構函式把test拷貝給s,fun函式執行完後析構掉s.

②物件以值傳遞的方式從函式返回

string fun()
執行過程:首先會產生乙個臨時變數就叫tmp,然後呼叫拷貝建構函式把s拷貝給tmp,然後fun程式結束後析構掉s,等到呼叫fun的函式結束後析構掉tmp.

③ 物件需要通過另外乙個物件進行初始化;

string s(「123」);

string s1 = s;

string s2(s);

後兩句都會呼叫拷貝建構函式。

通過宣告乙個私有拷貝建構函式,私有建構函式,私有賦值建構函式可以防止預設拷貝,預設構造,預設賦值構造發生。

5.拷貝建構函式形式

對於乙個類x, 如果乙個建構函式的第乙個引數是下列之一:

a) x&

b) const x&

c) volatile x&

d) const volatile x&

且沒有其他引數或其他引數都有預設值,那麼這個函式是拷貝建構函式.類中可以存在超過乙個拷貝建構函式,如果乙個類中只存在乙個引數為 x& 的拷貝建構函式,那麼就不能使用const x或volatile x的物件實行拷貝初始化.如果乙個類中沒有定義拷貝建構函式,那麼編譯器會自動產生乙個預設的拷貝建構函式。這個預設的引數可能為 x::x(const x&)或 x::x(x&),由編譯器根據上下文決定選擇哪乙個。

賦值運算子和複製建構函式都是用已存在的b物件來建立另乙個物件a。不同之處在於:賦值運算子處理兩個已有物件,即賦值前b應該是存在的;複製建構函式是生成乙個全新的物件,即呼叫複製建構函式之前a不存在。

C 建構函式和析構函式

1.建構函式是類的一種特殊方法,每次建立類的例項都會呼叫它。在建立乙個類的例項時,建構函式就像乙個方法一樣被呼叫,但不返回值。語法格式 訪問修飾符 類名 特性 1 其名字必須與類名相同,例如 public class myclass 2 不能被直接呼叫,必須通過new運算子來 呼叫。publiccl...

C 建構函式和析構函式

建構函式 class rectangel rectangel int l,int w 這是帶引數的建構函式,建構函式都是沒有返回值,並且和該類同名 int area 這是另一種形式的內聯函式,把宣告和定義寫在一起的也是內聯函式 private int length int width 析構函式 cl...

C 建構函式和析構函式

一 建構函式的介紹 1.建構函式的作用 建構函式主要用來在建立物件時完成對物件屬性的一些初始化等操作,當建立物件時,物件會自動呼叫它的建構函式。一般來說,建構函式有以下三個方面的作用 給建立的物件建立乙個識別符號 為物件資料成員開闢記憶體空間 完成物件資料成員的初始化。2.預設建構函式 當使用者沒有...