一、構造函數的定義
在c++中,每個類都會有一個特殊的成員函數——構造函數。它們可以用來初始化對象的各個成員變量,並分配任何必要的資源。構造函數的名稱必須與類名稱相同,並且不能有返回類型、不帶參數或帶一些默認值的參數。下面是一個簡單的類定義,其中包含了一個構造函數:
class Person { public: Person() { age = 0; name = "No Name"; } private: int age; string name; };
在這個例子中,構造函數中將age和name初始化為默認值0和”No Name”。通過這種方式,構造函數可以在用戶不必為每個變量賦值的情況下創建對象。但是,構造函數還可以採用其他方法,如從輸入參數中初始化對象的成員變量。
二、默認構造函數
如果一個類沒有定義自己的構造函數,那麼它將會自動獲得一個默認構造函數。 默認構造函數被稱為無參構造函數,因為它沒有輸入參數。默認構造函數的定義如下:
class ClassName { public: ClassName() { // constructor code } };
如果類中沒有定義構造函數,編譯器將自動為其生成一個無參數構造函數。但是,如果已經在類中定義了自己的構造函數,那麼編譯器不會為其生成一個默認的無參構造函數。
三、拷貝構造函數
拷貝構造函數是構造函數的一種特殊形式,被用於將一個對象作為輸入參數創建一個新對象。由於它可以從一個現有對象中創建一個新對象,因此這種構造函數被稱為拷貝構造函數。拷貝構造函數的參數是一個常量引用,該引用指向要從中創建新對象的源對象。
class ClassName { public: ClassName(const ClassName& copyFrom) { // constructor code } };
拷貝構造函數的編寫方式與其他構造函數不同的地方在於,它需要將其他對象的狀態複製到新對象中。通常,我們會使用成員變量的拷貝構造函數來完成此任務。以下是一個拷貝構造函數的示例:
class Person { public: Person(const Person& other) { age = other.age; name = other.name; } private: int age; string name; };
四、構造函數的初始化
c++中可以使用初始化列表來初始化成員變量。初始化列表通常在構造函數的參數列表後跟着一個冒號列表,其中每個條目都用逗號分隔。初始化列表只能用於構造函數,不能用於其他函數。下面是一個簡單的例子:
class Person { public: Person(int theAge, const string& theName) : age(theAge), name(theName) { // constructor code } private: int age; string name; };
在這個例子中,Initialer列表在構造函數聲明中指定年齡和名稱變量,用於初始化age和name變量。這樣可以幫助避免由於使用默認構造函數而導致不必要的初始化。
五、構造函數的重載
c++中允許重載構造函數,就像重載普通的函數一樣。重載構造函數可以幫助我們提供幾個不同方式來創建對象。有時,可能需要有幾個不同的構造函數來初始化對象的不同部分,具體取決於應用程序的需要。下面是一個利用重載構造函數來實現不同初始化的例子:
class Person { public: Person() { age = 0; name = "No Name"; } Person(int theAge) { age = theAge; name = "No Name"; } Person(const string& theName) { age = 0; name = theName; } Person(int theAge, const string& theName) { age = theAge; name = theName; } private: int age; string name; };
在這裡,Person類有不同的構造函數,每個構造函數都提供了一種不同的方式來初始化Person對象。例如,有一個使用age初始化的構造函數,有一個使用name初始化的構造函數,還有一個使用兩個參數age和name初始化的構造函數。
六、構造函數的繼承
在c++中,一個派生類可以繼承其基類中的構造函數。當基類構造函數被調用時,它會初始化基類的成員變量和基類的函數。下面的示例中,派生類Student繼承了基類Person的構造函數:
class Person { public: Person(const string& theName) { name = theName; } private: string name; }; class Student : public Person { public: Student(const string& theName, int theAge) : Person(theName) { age = theAge; } private: int age; };
在這裡,派生類Student繼承了基類Person的構造函數,並在調用Person的構造函數時使用了輸入參數theName。由於Person類中沒有age變量,所以在派生類Student的構造函數中進行了初始化。
七、總結
在c++中,構造函數是用於初始化對象的內置函數。各種類型的構造函數可以在c++中得到廣泛應用。例如,例如默認構造函數、拷貝構造函數、帶有初始化列表的構造函數、重載構造函數和繼承的構造函數。了解這些構造函數的類型以及它們的優缺點和用例可以幫助開發人員設計出更好的c++類和庫。
原創文章,作者:SGWR,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/136629.html