C 學習 建構函式和析構函式

2021-10-19 21:51:54 字數 2762 閱讀 5954

當建立物件的時候,這個物件應該有乙個初始狀態;

當物件銷毀之前應該銷毀自己建立的一些資料。

c++中的解決方案,建構函式和析構函式,這兩個函式將會被編譯器自動呼叫,完成物件初始化和物件清理工作

不管有沒有我們有沒有提供初始化操作和清理操作,編譯器也會增加預設的操作,只是這個預設初始化操作不會做任何事,所以編寫類就應該順便提供初始化函式。

建構函式:與類名相同,沒有返回值,不寫void,可以發生過載(可以沒有引數,也可以有引數)

析構函式:與類名相同,類名前面加乙個符號「~」,也沒有返回值,不寫void,不可以有引數,也不能發生過載

不管是建構函式還是析構函式,作用域都是public下的

class person

//析構函式寫法

//與類名相同,類名前面加乙個符號「~」,也沒有返回值,不寫void,不可以有引數,也不能發生過載

~person() };

void test01()

int main()

建構函式的分類及呼叫

按照引數進行分類 無參建構函式(預設建構函式) 有參建構函式

按照型別進行分類 普通建構函式 拷貝建構函式

//建構函式的分類及呼叫

//1、按照引數進行分類 無參建構函式(預設建構函式) 有參建構函式

//2、按照型別進行分類 普通建構函式 拷貝建構函式

class person

person(int a)

person(const person &p) //拷貝建構函式必須加const,因為只是拷貝,不是修改

~person()

int m_age;

};void test01()

用已經建立好的物件來初始化新的物件

以值傳遞的方式給函式傳值

以值方式返回區域性物件

class person

person(int a)

person(const person &p) //不用&的話會變成值傳遞,那樣就會進去迴圈開闢空間的情況

~person()

int m_age;

};//拷貝構造呼叫的實際

//1、用已經建立好的物件來初始化新的物件

void test01()

//2、以值傳遞的方式給函式傳值

void dowork(person p1) //person p1=person(p1)

void test02()

//3、以值方式返回區域性物件

person dowork2()

void test03()

//release下優化成什麼樣???

/*person p;

dowork2(p); //以引用的方式呼叫函式,這個時候就不用呼叫拷貝構造了,呼叫預設構造

void dowork2(person &p)

*/

如果類只提供了有參建構函式,那麼系統就不會提供預設建構函式了, 但是系統還會提供預設拷貝函式

提供了拷貝構造,那麼系統就不會提高其他構造了

class myclass

*/ myclass(int a)

myclass(const myclass &c)

int a;

};// 1、如果類只提供了有參建構函式,那麼系統就不會提供預設建構函式了, 但是系統還會提供預設拷貝函式

void test01()

//2、提供了拷貝構造,那麼系統就不會提高其他構造了

淺拷貝:就是呼叫預設的拷貝函式,函式只會進行簡單的拷貝;如果屬性裡有指向堆區空間的資料,那麼簡單的淺拷貝會導致重複釋放記憶體的異常

深拷貝:深拷貝就可以解決這種問題,深拷貝就是自己實現乙個拷貝建構函式,可以解決淺拷貝的問題;相當於是再開闢乙個空間,p1釋放自己的,p2釋放自己的

//深拷貝和淺拷貝

class person

person(const char *name, int age) //有參建構函式

//拷貝構造 系統會提供預設拷貝構造,而且是簡單的值拷貝

person(const person &p) //自己實現乙個拷貝建構函式,去申請一塊新的堆空間

~person() //析構函式 }

char *m_name;

int m_age;

};

基本語法:建構函式後面+ :屬性(引數),屬性(引數),....

//初始化列表的基本使用

class person

//有參構造用來初始化資料

/*person(int a, int b, int c)

*/ //利用初始化列表 初始化資料

// 建構函式後面+ :屬性(引數),屬性(引數),....

person(int a, int b, int c) :m_a(a), m_b(b), m_c(c)

{} int m_a;

int m_b;

int m_c;

};void test01()

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.c 的建構函式有預設建構函式,一般的建構函式,賦值建構函式,拷貝建構函式 複製建構函式 強制型別轉化建構函式。2.如果沒有定義建構函式和析構函式,則c 編譯器會按照 位拷貝 的方式提供預設的建構函式 不初始化 預設的賦值建構函式 淺賦值 預設的拷貝建構函式 淺拷貝 預設的析構函式。位拷貝要小心指...