c++重點語法彙總(2)
建構函式
-
在定義類的物件時,系統會自動呼叫建構函式來建立並初始化物件
-
建構函式的申明和定義
-
在類體內需要宣告建構函式,形式如下:類名 ([形式引數列表]);
-
在類體外定義建構函式的形式如下:類名::類名([形式引數表]){函式體}//其實現部分可以在類體內實現
-
這裡的形式引數允許帶預設值,若建構函式在類體內實現,則去掉前面的類名::限定符
-
-
建構函式具有以下性質:
-
建構函式的函式名必須與類名相同,以類名為函式名的函式一定是建構函式
-
建構函式沒有返回值型別,前面一定不能新增void
-
建構函式為public屬性,否則定義物件時無法自動呼叫建構函式,編譯時會出現錯誤
-
建構函式只有在建立物件時由系統自動呼叫,所定義的物件名後要提供建構函式所要實現的實際引數,形式為:物件名(實際引數表),注意,既然在定義物件的同時系統已經完成了物件的初始化工作,就不能子啊程式中寫出形如物件名.建構函式名(實際引數表)的呼叫建構函式語句
-
-
建構函式可以建立物件並初始化物件,任何類的物件在建立時必定要自動呼叫建構函式,如果程式設計師在類中沒有定義建構函式,C++系統會自動生成一個預設的建構函式,該建構函式無形式引數,也無任何語句,其功能僅用於建立物件,為物件分配空間但不對其中的資料成員進行初始化,系統預設的建構函式的格式如下:類名::類名(){}
-
說明:如果類定義中已經為類提供了一個建構函式,編譯器就不會再提供預設的無參建構函式,每次定義類物件時,編譯器會自動查詢最適合的建構函式去呼叫。例如,如果定義物件時沒有提供實際引數,編譯器會自動查詢無參建構函式,如果類定義中已定義了其他有參建構函式而沒有定義無參建構函式,C++會給出一個錯誤提示,可以通過函式過載來實現
-
注意:一個類可以擁有多個建構函式,對建構函式可以進行過載,過載的多個建構函式必須在形式引數的型別、個數、順序這三個方面的至少一個方面體現出區別,符合過載函式的條件。形式引數表可以為空
-
重點:在定義物件的同時程式自動呼叫建構函式
拷貝建構函式
-
拷貝建構函式也是類的一個過載版本的建構函式,它能夠用一個已知的物件初始化另一個新建立的同類新物件,C++為每一個類定義了一個預設的拷貝建構函式,拷貝建構函式的定義格式如下:class 類名{public:類名(const 類名&物件名)};類名::類名(const 類名&物件名){}
-
拷貝建構函式在以下3種情況下系統自動呼叫
-
明確表示一個物件初始化另一個物件
-
當物件作為函式的實際引數傳遞給函式的值形式引數,注意,如果形式引數是引用引數或指標引數,都不會呼叫拷貝建構函式,因為不會產生新物件
-
當物件作為函式返回值
-
解構函式
-
解構函式的申明和定義與建構函式的形式僅多了一個~
-
說明:
-
解構函式也是類的特殊成員函式
-
解構函式沒有返回值,必須定義為public屬性
-
解構函式沒有形式引數,此時解構函式不能寫成)(void)的形式,由於沒有形式引數,因此解構函式不能被過載,每個類只能擁有一個解構函式
-
解構函式的呼叫也是自動執行的,在兩種情況下自動呼叫解構函式:第一種是在物件生存週期結束時系統會自動呼叫解構函式;第二種是對用new運算子動態建立的物件,在用delete運算子釋放時也自動呼叫解構函式
-
和建構函式一樣,系統會提供一個預設的解構函式:~類名(){}
-
-
一般情況下使用系統預設的解構函式即可,但是,如果一個類中有指標型別的資料成員,並且在建構函式中該指標申請了動態記憶體空間,此時一定要定義解構函式來釋放通過指標所申請的動態空間,保證物件生存週期結束時釋放所有的記憶體空間
-
注意:建構函式的呼叫順序與主函式的呼叫順序相同,但解構函式的呼叫順序與建構函式正好相反
友元函式
-
判斷兩個賦值的物件是否相等,呼叫Equal函式,原型:bool Equal(類名 &類名A,類名 &類名B);呼叫函式Equal(物件,物件),如果這兩個賦值物件相等,則返回true,否則返回false
-
普通函式無法訪問類的私有資料成員,但如果將函式定義為類的友元函式,則可以直接訪問類的私有成員
-
友元函式的申明為:friend 函式返回型別 函式名(形式引數表);
-
注意:
-
通常友元函式是在類的定義中給出原型說明,申明的位置任意,不受訪問屬性的限制,申明後的友元函式在類外面給出完整定義,此時前面不能加關鍵詞friend
-
友元函式可以直接在類的內部給出定義,定義的首部相當於原型說明
-
友元函式的定義方式和呼叫方式和普通函式一樣
-
友元函式提供了不同類成員函式之間、類的成員函式與普通函式之間進行資料共享的機制,尤其是一個函式需要訪問多個類時,友元函式非常有用
-
友元畢竟打破了封裝和資訊隱藏機制,因此在安全性和效率之間需做折中考慮
-
一個類的成員函式作為另一個類的友元成員時,必須先定義這個類,並且在宣告友元成員時,要加上成員函式所在類的類名
-
對於先使用後定義的識別符號都應當給出當前引用宣告
-
靜態資料成員
-
靜態資料成員是解決同一個類的不同物件之間資料共享問題
-
靜態資料成員的申明形式為:static 型別名 靜態資料成員名;
-
靜態資料成員是在編譯時建立並初始化的
-
公有的靜態資料成員可以在物件定義之前被訪問,形式:類名::公有靜態成員變數名
-
公有的靜態資料成員在物件定義之後還可以通過物件進行訪問,形式如下:物件名.公有靜態成員變數名
-
私有的靜態資料成員不能被類的外部函式訪問,也不能用物件名直接進行訪問,而需要通過物件呼叫操作該靜態資料成員的公有函式進行
-
靜態資料成員的初始化:型別 類名::類名 變數名= 值(int Student::total=0)
函式模板與模板函式
-
模板的定義形式:template <class 型別形式引數> 函式返回型別 函式名 (形式引數表){}:template是一個宣告模板的關鍵字,class在此並不表示類的意思,只是借用此關鍵字表示其後是一個型別引數。型別形式引數表中的內容是用來抽象型別的標識,將來可以用任何實際的型別(包括類型別)進行例項化
-
模板的定義格式中“型別形式引數表”說明在定義模板時,型別引數可以時由多個引數型別組成的,每個型別前面都必須由關鍵字class引導