物件的初始化和清理也是也是兩個非常重要的安全問題
乙個物件或者變數沒有初始狀態,對其使用,後果是未知的
使用完乙個物件或者變數,沒有及時清理,也會造成一定安全問題
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複製建構函式 引入複製建構函式是為了讓類的物件直接生成另乙個物件,同時把此物件的資料複製到另乙個物件中 如果類中沒有實現複製建構函式,編譯器自動新增乙個,如果我們不需要,則把它明...