如何在c ++中从单个对象调用参数化和非参数化构造函数

时间:2015-10-13 14:56:03

标签: c++ constructor overloading

如果object是整个类的实例,为什么我们不能从单个对象调用参数化和非参数化的构造函数。

{hook h="displayNav"}
来自的

如何从一个对象调用两个构造函数;

2 个答案:

答案 0 :(得分:1)

我建议你在构造函数中使用调用构造函数(带参数)(不带参数),也称为构造函数委托:

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

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

在main中你可以调用两个构造函数只创建一个对象:

int main()
{
    ovrldng obj;
}

希望这就是你要找的东西。

答案 1 :(得分:1)

通过多个构造函数初始化对象有多种方法。

使用它取决于个人偏好/编码指南,用例(可能是构造函数不同以共享代码)和技术限制(例如编译器不支持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)。 我只是没有使用它们来使不同的类更容易比较。