C++ 中的過載建構函式
Jinku Hu
2023年10月12日
本文將解釋如何在 C++ 中實現過載建構函式。
C++ 中的建構函式基礎和建構函式過載
建構函式是 C++ 類中的一個特殊成員函式,其任務是初始化類的物件。建構函式沒有特殊名稱,不能直接呼叫,但是每次建立給定的類時,通常都會呼叫相應的建構函式。雖然,我們宣告瞭與類本身同名的建構函式。由於 C++ 提供了一種在給定範圍內定義多個同名函式的方法,我們也可以為單個類定義多個建構函式。
請注意,函式過載規則適用於過載的建構函式,因為它們需要在接受的引數或型別的數量上有所不同。C++ 指定了不同型別的建構函式,它們通常有特定的用例,但由於其範圍廣泛,我們不會在本文中深入研究這些細節。
在以下示例程式碼中,定義了 Student
類,包括兩個 string
型別的 private
資料成員。這些成員應該在建立 Student
類的新例項時初始化,但我們假設只有 name
成員是必需的。因此,我們需要有不同的方法來構造這個類的物件,其中之一隻初始化 name
成員。
因此,我們定義了第一個建構函式,它只接受一個 string
引數並將相應的訊息列印到控制檯。後一步僅用於輕鬆識別建構函式的行為。此外,我們還定義了第二個建構函式,它接受兩個 string
引數並初始化兩個資料成員 - name
和 last_name
。
#include <iostream>
using std::cout;
using std::endl;
using std::string;
class Student {
private:
string name;
string last_name;
public:
explicit Student(string n) : name(std::move(n)) {
cout << "Constructor 1 is called" << endl;
};
Student(string &n, string &ln) : name(n), last_name(ln) {
cout << "Constructor 2 is called" << endl;
};
string getName() { return name; }
string getLastName() { return last_name; }
};
int main() {
string n1("James");
string n2("Kale");
Student s1(n1, n2);
cout << s1.getName() << endl;
cout << s1.getLastName() << endl;
cout << "------------------" << endl;
Student s2(n1);
cout << s2.getName() << endl;
cout << s2.getLastName() << endl;
cout << "------------------" << endl;
return EXIT_SUCCESS;
}
輸出:
Constructor 2 is called
James
Kale
------------------
Constructor 1 is called
James
------------------
請注意,當我們在 main
程式中建立 s1
物件時,第二個建構函式被呼叫,因為我們提供了兩個引數,當 s2
被初始化時,第一個建構函式被呼叫。在這種情況下,我們有兩個具有不同數量引數的建構函式,但一般來說,我們可以定義兩個具有相同數量引數但它們接受的型別不同的建構函式。
作者: Jinku Hu