在对象定义之后调用构造函数

时间:2016-07-31 19:08:58

标签: c++ object-composition

class first{
    int fa,fb;

    public:
        first();
        first(int x,int y);
        void display();
};

first::first():fa(0),fb(0){
       }

first::first(int x,int y):fa(x),fb(y){
}

void first::display(){
    cout<<fa<<" "<<fb;
}

class second{
    first f;
    int sa,sb;

    public:
        second();
        second(int x,int y,int a,int b);
        void display();
};

second::second():sa(0),sb(0){
}

second::second(int x,int y,int a,int b):f(x,y),sa(a),sb(b){
}

void second::display(){
    cout<<"The Numbers are ";
    f.display();
    cout<<" "<<sa<<" "<<sb<<endl;
}

如果已经提出这个问题,我道歉。

这是一个简单的代码,用于演示c ++中嵌套类的工作原理。 但是,在类second中,对象f即使之前已经定义过,我也可以使用second类的构造函数在其上调用构造函数。 如何在已定义的类实例上调用构造函数?

2 个答案:

答案 0 :(得分:0)

对象first f;second的成员。这意味着每个second都包含first。因此,在创建second的过程中,必须创建first。您的mem-initializer f(x,y)详细说明了在创建f对象时如何创建second

答案 1 :(得分:0)

当在函数中定义变量时,您可以混合使用不同的概念:

void foo()
{
    Foobar f; // f is defined and default initialized  here
    Foobar d { 123 }; // d is defined and initialized with 123
}

并声明为classstruct

中的字段
struct boo {
    Foobar f; // f is declared as member of type boo and how it will be
              // initialized will be known in boo's constructor
              // not here

    boo() {} // f is default constructed
    boo( int i ) : f { i } {} // f is initialized with i
};

为了让你在c ++ 11中更糟糕,你可以将参数传递给字段构造函数:

struct boo {
    Foobar d { 123 };  // d would be initialized with 123 if otherwise is not set in boo's constructor

    boo( int i ) : d { i } {} // 123 is ignored and d is initialized with i
    boo() {} // d { 123 } is used
};

所以即使你将参数传递给字段,如何在boo的构造函数中定义字段的初始化。