一、初始化列表
C++中,構造函數是一種在對象被創建時執行的方法,它的主要任務是初始化類的狀態。為了在構造函數中初始化成員變數,我們可以使用初始化列表(Initialization List),它是一種特殊的語法形式,可以在構造函數聲明的括弧後的冒號後面加上成員變數的初始化表達式。
class Person { private: string name; int age; public: Person(string _name, int _age) : name(_name), age(_age) {} };
在上面的代碼中,我們使用初始化列表來初始化name和age成員變數。初始化列表的語法形式是: 成員變數名1(初始化表達式1), 成員變數名2(初始化表達式2), …
在使用初始化列表的時候,不僅可以初始化成員變數,還可以初始化常量成員和通過引用和指針引用的成員變數,這大大增強了C++語言初始化的靈活性。
二、默認參數
如果程序員在編寫構造函數的時候沒有為所有參數提供默認值,則在使用構造函數創建對象時必須為該構造函數的每個參數提供值。C++提供了一種將某些參數設為默認參數(Default Parameters)的方法。
class Rectangle { private: double length; double breadth; public: Rectangle(double _length = 1.0, double _breadth = 1.0) : length(_length), breadth(_breadth) {} };
在上面的代碼中,我們在構造函數中為length和breadth成員變數提供了默認值,這意味著我們可以用以下方式創建對象,而不必提供參數:
Rectangle r1; //創建一個長和寬都為1.0的矩形 Rectangle r2(3.0); //創建一個長為3.0,寬為1.0的矩形 Rectangle r3(4.0, 5.0); //創建一個長為4.0,寬為5.0的矩形
三、委託構造函數
C++11引入了一種委託構造函數(Delegating Constructor)的語法形式,它可以在一個構造函數中調用另一個構造函數,使得構造函數代碼更加簡潔。
class Person { private: string name; int age; string address; public: Person(string _name, int _age, string _address) : name(_name), age(_age), address(_address) {} Person(string _name, int _age) : Person(_name, _age, "") {} //調用有三個參數的構造函數,在address上提供默認值 };
在上面的代碼中,我們使用委託構造函數將Person類的三個參數的構造函數委託給了兩個參數的構造函數。由於兩個構造函數都使用初始化列表,因此兩個構造函數最終都會將參數傳遞給同一個構造函數。
四、繼承構造函數
C++11還引入了繼承構造函數(Inheriting Constructor)的語法形式,可以從基類中繼承構造函數,這樣可以了簡化子類的代碼。
class Animal { protected: string type; int age; public: Animal(string _type, int _age) : type(_type), age(_age) {} }; class Cat : public Animal { public: using Animal::Animal; //繼承Animal類的構造函數,將其暴露給子類 void Meow() { cout << "Meow..." << endl; } //添加自己的函數 };
在上面的代碼中,我們使用using關鍵字繼承了父類Animal的構造函數,但是在子類Cat中我們也添加了自己的函數Meow()。這樣,我們可以通過一個簡單的語法來創建Cat對象並調用父類構造函數。
五、總結
在C++中,構造函數是一種初始化類狀態的重要方法。我們可以使用初始化列表來初始化成員變數、使用默認參數來簡化構造函數的調用、使用委託構造函數來簡化構造函數代碼、使用繼承構造函數來減少代碼重複量。
完整代碼示例: #include #include using namespace std; class Person { private: string name; int age; string address; public: Person(string _name, int _age, string _address) : name(_name), age(_age), address(_address) {} Person(string _name, int _age) : Person(_name, _age, "") {} //調用有三個參數的構造函數,在address上提供默認值 }; class Rectangle { private: double length; double breadth; public: Rectangle(double _length = 1.0, double _breadth = 1.0) : length(_length), breadth(_breadth) {} }; class Animal { protected: string type; int age; public: Animal(string _type, int _age) : type(_type), age(_age) {} }; class Cat : public Animal { public: using Animal::Animal; //繼承Animal類的構造函數,將其暴露給子類 void Meow() { cout << "Meow..." << endl; } //添加自己的函數 }; int main() { Person p1("Bob", 30, "Beijing"); Rectangle r1; Rectangle r2(3.0); Rectangle r3(4.0, 5.0); Cat c1("Tom", 2); c1.Meow(); return 0; }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/160572.html