網頁

2022/8/15

C++ 預設建構式 default constructor

C++的預設建構式(default constructor)為無參數的建構式。


當宣告類別未定義任何建構式,則編譯器會自動隱含產生一個無參數的預設建構式。

例如下面類別Car未定義任何建構式,則編譯器隱含產生預設建構式Car()。而建立無初始化物件時會調用預設建構式。

#include <iostream>
#include <string>
using namespace std;

class Car {
    private:
        // 屬性 attributes
        string model;
        int speed;

    public:
        // 方法 methodss
        string GetModel() { return model; }
        void SetModel(string model) { this->model = model; }
        int GetSpeed() { return speed; }
        void SetSpeed(int speed) { this->speed = speed; }
};

int main() {
    Car car; // 調用預設建構式Car()

    car.SetModel("MAZDA CX-30");
    car.SetSpeed(60);

    cout << car.GetModel() << endl; // MAZDA CX-30
    cout << car.GetSpeed() << endl; // 60

    return 0;
}

若類別已定義了有參數的建構式則不會產生隱含的預設建構式。例如下面Car類別定義了建構式Car(string model)則編譯器不會產生預設建構式Car(),又建立未初始化物件時會調用無參數的建構式來建立物件,因此發生呼叫建構式錯誤。

main.cpp

#include <iostream>
#include <string>
using namespace std;

class Car {
    private:
        // 屬性 attributes
        string model;
        int speed;

    public:
        // 建構式 constructor
        Car(string model) : model(model) {}

        // 方法 methodss
        string GetModel() { return model; }
        void SetModel(string model) { this->model = model; }
        int GetSpeed() { return speed; }
        void SetSpeed(int speed) { this->speed = speed; }
};

int main() {
    Car car1 = {"MAZDA CX-30"}; // ok
    Car car2; // error: no matching constructor for initialization of 'Car'

    return 0;
}


沒有留言:

張貼留言