C 學習筆記11,C 核心程式設計

2021-10-19 08:56:29 字數 3799 閱讀 6307

物件的初始化和清理也是也是兩個非常重要的安全問題

乙個物件或者變數沒有初始狀態,對其使用,後果是未知的

使用完乙個物件或者變數,沒有及時清理,也會造成一定安全問題

c++利用建構函式和析構函式 解決上述問題,這兩個函式會被編譯器自動呼叫,完成物件的初始化和清理工作

物件的初始化和清理工作是編譯器強制要求做的事情,如果不提供建構函式和析構函式,編譯器會自動呼叫編譯器提供的建構函式和析構函式的空實現(空函式體)。

建構函式:建立物件時,為物件的成員屬性賦值,由編譯器自動呼叫,無需手動

析構函式:物件銷毀前,系統自動呼叫,執行一些清理工作

建構函式:類名(){}

1、沒有返回值,不寫void

2、函式名與類名相同

3、可以有引數,可以發生過載

4、程式在呼叫物件時候自動呼叫構造,無需手動呼叫,而且只會呼叫一次

析構函式:~類名(){}

1、沒有返回值,不寫void

2、函式名與類名相同,在類名前加 ~

3、不可以有引數,不可以發生過載

4、程式在物件銷毀前會自動呼叫析構,無需手動呼叫,而且只會呼叫一次

class

baby

//析構函式

~baby()

};void

test12()

intmain20()

兩種分類方式

按引數分為:有參構造和無參構造(預設構造)

按型別分為:普通構造和拷貝構造

三種呼叫方式

括號法顯示法

隱式轉換法

//分類

class

person2

~person2()

//有參建構函式

person2

(int a)

//拷貝建構函式

person2

(const person2& p)

//加const保證本體不會被修改掉,同時必須引用傳值};

//呼叫

void

test13()

intmain21()

常見的三種情況

使用乙個建立完成的物件來初始化乙個新物件

值傳遞的方式給函式引數傳值

以值的方式返回區域性物件

class

person3

~person3()

person3

(int age)

person3

(const person3& p)};

//1、使用乙個建立完成的物件來初始化乙個新物件

void

test14_1()

//2、值傳遞的方式給函式引數傳值

void

dowork

(person3 p)

//值傳遞本質:會拷貝乙個臨時的副本出來

void

test14_2()

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

person3 dowork2()

void

test14_3()

intmain22()

預設情況下,c++編譯器至少會給乙個類新增3個函式:

預設建構函式(無參,函式體為空)

預設析構函式(無參,函式體為空)

預設拷貝建構函式(對屬性進行值拷貝)

呼叫規則:

如果使用者定義有參建構函式,c++不再提供預設無參構造,但會提供預設拷貝構造

如果使用者定義拷貝建構函式,c++不再提供其他普通建構函式(預設無參和有參構造)

深淺拷貝是面試經典問題,也是最常見的乙個坑!!!

淺拷貝:簡單的賦值拷貝操作(編譯器自動生成的就是淺拷貝)

深拷貝:在堆區重新申請空間,進行拷貝操作

class

person4

~person4()

cout <<

"person4 析構函式呼叫"

<< endl;

}person4

(int age,

int height)

//自己實現拷貝建構函式,解決淺拷貝帶來的問題

person4

(const person4& p)};

void

test15()

// p1 p2存放在棧區,棧區先進後出,p2先出,先呼叫析構函式,釋放堆區;p1後出,再次呼叫析構函式,釋放堆區

// 堆區被重複釋放!!!

intmain23()

總結:如果屬性有在堆區開闢的,一定要自己提供拷貝建構函式,防止淺拷貝帶來的問題

作用:c++提供了初始化列表語法,用來初始化屬性

語法: 建構函式() : 屬性1(值1),屬性2(值2)…{}

class

person5

//初始化列表初始化操作

//person5() :p_a(10), p_b(20), p_c(30)

////或者:

person5

(int a,

int b,

int c)

:p_a

(a),

p_b(b)

,p_c

(c)}

;void

test16()

intmain24()

//c++類中的成員可以是另乙個類的物件,稱該成員為 物件成員

classa;

classb;

//b類中有物件a 作為成員,稱 a 為物件成員

class

phone

~phone()

};class

person6

~person6()

};void

test17()

intmain25()

當其他類物件作為本類成員,構造時候先構造類物件成員,再構造自身;析構順序與構造相反

靜態成員:在成員變數和成員函式前加上關鍵字 static,稱為靜態成員

分類

靜態成員變數

1、所有物件共享同乙份資料

2、在編譯階段分配記憶體

3、類內宣告、類外初始化

靜態成員函式

1、所有物件共享同乙個函式

2、靜態成員函式只能訪問靜態成員變數

class

person7

//靜態成員函式也有訪問許可權

//private:

// static void bbb()

// }

;int person7::p_age =18;

//類外初始化(int不能省略

//static int p_age = 18;

//int p_age = 18; //都不對,必須宣告是什麼型別的哪個類下的靜態變數

void

test18()

intmain26()

11 C 筆記 函式 方法

1 函式基本使用 函式的呼叫方法用c 主函式要在乙個class中,靜態的,無返回值 見示例using system class test ret console.readline 支援遞迴 2 函式的輸入輸出 1 值傳遞 正常同c 2 引用傳遞 ref 關鍵字 using system static...

11 C語言陣列

陣列的幾個名詞 陣列的應用場景 include int main int argc,const char ar int 元素型別 ages 陣列名稱 10 元素個數 int ages 10 int ages 3 int nums int nums 10 int nums 5 int nums int...

11 C 類複製控制

類複製控制 前言,定義,基類與派生類,設計指導 1.前言 複製控制通常指類的複製建構函式,賦值操作運算子,析構函式 1.1複製建構函式 引入複製建構函式是為了讓類的物件直接生成另乙個物件,同時把此物件的資料複製到另乙個物件中 如果類中沒有實現複製建構函式,編譯器自動新增乙個,如果我們不需要,則把它明...