C++ 中的過載建構函式

Jinku Hu 2021年10月2日
C++ 中的過載建構函式

本文將解釋如何在 C++ 中實現過載建構函式。

C++ 中的建構函式基礎和建構函式過載

建構函式是 C++ 類中的一個特殊成員函式,其任務是初始化類的物件。建構函式沒有特殊名稱,不能直接呼叫,但是每次建立給定的類時,通常都會呼叫相應的建構函式。雖然,我們宣告瞭與類本身同名的建構函式。由於 C++ 提供了一種在給定範圍內定義多個同名函式的方法,我們也可以為單個類定義多個建構函式。

請注意,函式過載規則適用於過載的建構函式,因為它們需要在接受的引數或型別的數量上有所不同。C++ 指定了不同型別的建構函式,它們通常有特定的用例,但由於其範圍廣泛,我們不會在本文中深入研究這些細節。

在以下示例程式碼中,定義了 Student 類,包括兩個 string 型別的 private 資料成員。這些成員應該在建立 Student 類的新例項時初始化,但我們假設只有 name 成員是必需的。因此,我們需要有不同的方法來構造這個類的物件,其中之一隻初始化 name 成員。

因此,我們定義了第一個建構函式,它只接受一個 string 引數並將相應的訊息列印到控制檯。後一步僅用於輕鬆識別建構函式的行為。此外,我們還定義了第二個建構函式,它接受兩個 string 引數並初始化兩個資料成員 - namelast_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 被初始化時,第一個建構函式被呼叫。在這種情況下,我們有兩個具有不同數量引數的建構函式,但一般來說,我們可以定義兩個具有相同數量引數但它們接受的型別不同的建構函式。

Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Class