簡體   English   中英

如何在C ++中從單個對象調用參數化和非參數化構造函數

[英]how to call parameterized and non parameterized constructor from single object in c++

如果對象是整個類的實例,為什么不能從單個對象調用參數化和非參數化構造函數。

class ovrldng {
public:
    int var;
    ovrldng() {
        var=101;
        cout << "Default constructor assigned value into var=" << var ;
    }

    ovrldng(int x) {
        var=x;
        cout << "Parametrized assign 'x' value to var =" << var ;
    }
};

從主要方面講如何從一個對象調用兩個構造函數;

我建議您在構造函數(不帶參數)中使用調用構造函數(帶參數),也稱為構造函數委托:

ovrldng() : ovrldng(101)
{
    cout << "Default constructor assigned value into var=" << var ;
}

ovrldng(int x) : var(x)
{
    cout << "Parametrized assign 'x' value to var =" << var ;
}

在主要方面,您可以只創建一個對象就調用這兩個構造函數:

int main()
{
    ovrldng obj;
}

希望這是您正在尋找的。

有多種通過多個構造函數初始化對象的方法。

使用哪一個取決於個人喜好/編碼准則,用例(構造函數可能不同以共享代碼)和技術限制(例如,編譯器不支持C ++ 11功能):

#include <iostream>

//Your current solution (works pre C++11)
class ovrldng_1 {
public:
    int var;
    ovrldng_1() {
        var = 101;
        std::cout << "ovrldng_1 var =" << var << std::endl;
    }

    ovrldng_1(int x) {
        var = x;
        std::cout << "ovrldng_1 var =" << var << std::endl;
    }
};


//Using a function to initialize (works pre C++11)
class ovrldng_2 {
public:
    int var;
    ovrldng_2() {
        init(101);
    }

    ovrldng_2(int x) {
        init(x);
    }

    void init(int x){
        var = x;
        std::cout << "ovrldng_2 var =" << var << std::endl;
    }
};


//Using a default value (works pre C++11)
class ovrldng_3 {
public:
    int var;
    ovrldng_3(int x=101) {
        var = x;
        std::cout << "ovrldng_3 var =" << var << std::endl;
    }
};


//Calling one constructor from another (constructor delegation) (C++11 is required)
class ovrldng_4 {
public:
    int var;
    ovrldng_4(int x) {
        var = x;
        std::cout << "ovrldng_4 var =" << var << std::endl;
    }

    ovrldng_4() : ovrldng_4(101){}
};

要測試這些對象,您只需創建每種類型的對象(以及每個定義的ctor)並檢查輸出即可:

int main(int argc, char* argv[])
{
    ovrldng_1 a;
    ovrldng_1 b(212);
    ovrldng_2 c;
    ovrldng_2 d(212);
    ovrldng_3 e;
    ovrldng_3 f(212);
    ovrldng_4 g;
    ovrldng_4 h(212);
    return 0;
}

輸出:

ovrldng_1 var = 101
ovrldng_1 var = 212
ovrldng_2 var = 101
ovrldng_2 var = 212
ovrldng_3 var = 101
ovrldng_3 var = 212
ovrldng_4 var = 101
ovrldng_4 var = 212

附錄您應該使用初始化程序列表(請參閱https://isocpp.org/wiki/faq/ctors#init-lists )。 我只是沒有使用它們來使不同的類更易於比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM