C++中的普通函數與類相關的函數
普通函數
C++是在C語言的基礎上增加了面向對象特性的語言,是C語言的超集
- C++中的普通函數與C語言中的普通函數具有類似的性質。請參照以下博客:C語言-04-函數
與類相關的函數
C是一種OOP語言,類是OOP語言的核心,C++中的一部分函數與類相關。
- 構造函數與拷貝構造函數
- 構造函數
- 是一種特殊的成員函數,在使用類創建對象時被執行,通常用於在創建對象時為某些成員變數設置初始值。
- 構造函數的定義規範
- 函數名與類名相同
- 不返回任何值
- 構造函數的種類
- 無參的構造函數
- 有參的構造函數
- 可以使用初始化列表來初始化欄位
定義方式
// 無參的構造函數 ClassName() { // body of the function } // 有參的構造函數,使用初始化列表 ClassName(MemberVariableType memberVariable) : variable(memberVariable) { // body of the function }
- 拷貝構造函數
- 是一種特殊的構造函數,在創建對象,使用同一類中之前創建過的對象來初始化新創建的對象
- 拷貝構造函數被調用的場景
- 使用另一個同類型的對象來初始化新創建的對象
- 賦值對象把它作為參數傳遞給函數
- 賦值對象,並從函數返回這個對象
- 註意
- 若沒有定義拷貝構造函數,編譯器會自動定義一個。但是在一下情形下,必須定義一個拷貝構造函數
- 類中有指針類型的成員變數,並且有動態記憶體分配
- 若沒有定義拷貝構造函數,編譯器會自動定義一個。但是在一下情形下,必須定義一個拷貝構造函數
定義方式
ClassName(const ClassName &classInstance) { variable = classInstance.variable }
- 構造函數
- 析構函數
- 是一種特殊的成員函數,在類的象被銷毀時被執行,通常用於在跳出程式前釋放資源
- 析構函數的定義規範
- 函數名與類名相同,需要在函數名前加上波浪號(~)作為首碼
- 不返回任何值,不帶有任何參數
定義方式
``` ~ClassName() { // Release the resource of the classInstance } ```
- 友元函數
- 一種定義在類的外部,有權訪問類的私有成員和保護成員的函數
定義方式
// 在類內部定義友元函數原型 friend returnType functionName(); // 在類外部定義友元函數的實現,不需要範圍解析運算符 :: returnType functionName() { body of the function; }
- 註意
- 友元函數不是成員函數,不能使用this指針
- 內聯函數
在編譯階段,編譯器會將內聯函數的代碼副本複製到每一個調用該該內聯函數的地方,使用inline關鍵字定義,如下
inline returnType functionName() { // body of the function }
- 內聯函數的註意事項
- 類定義中定義的函數,預設都是內倆函數,即使沒有使用inline關鍵字
- 每次修改內聯函數,都必須重新編譯該函數的所有調用代碼(替換函數調用處舊的內聯函數副本)
示例
定義Animal類
class Animal { private: string name; // 名字 int *age; // 年齡 public: // set方法 inline void setName(string animalName) { name = animalName; } void setAge(int animalAge) { *age = animalAge; } // 無參的構造函數 Animal() { cout << "Normal constructor" << endl; // 為指針分配記憶體地址 age = new int; } // 有參的構造函數 Animal(string animalName, int animalAge) { cout << "Normal constructor with parameter" << endl; name = animalName; // 為指針分配記憶體地址 age = new int; *age = animalAge; } // 拷貝構造函數 Animal(const Animal &animal) { cout << "Copy constructor" << endl; name = animal.name; // 為指針分配記憶體地址 age = new int; *age = *animal.age; } // 友元函數 friend void printAnimal(const Animal animal); // 析構函數 ~Animal() { cout << "Release the resource of the classInstance" << endl; delete age; } };
定義Animal類的友元函數
// 友元函數的定義 void printAnimal(const Animal animal) { cout << "狗的名字:" << animal.name << " 年齡:" << *animal.age << endl; }
main()函數
int main(int argc, const char * argv[]) { // 使用有參的構造函數創建Animal對象 Animal dog1; dog1.setName("TOBY"); dog1.setAge(5); // 使用友元函數列印dog1 printAnimal(dog1); // 使用無參的構造函數創建Animal對象 Animal dog2("MAX", 4); // 使用友元函數列印dog2 printAnimal(dog2); // 使用拷貝構造函數創建Animal對象 Animal dog3 = dog2; printAnimal(dog3); return 0; }