C ++类对象初始化

时间:2018-08-14 22:29:41

标签: c++

A是C ++的新手,并且想知道如何调用A类构造函数,因为B的默认构造函数没有初始化A。 注意:B类不是从A类继承的

#include "iostream"
using namespace std;
class A
{
    public:
    A() { cout << "A's Constructor Called " << endl;  }
};

class B
{
    A a;
    public:
    B() { cout << "B's Constructor Called " << endl; }
};

int main()
{
    B b1;
    return 0;
}

Output is :
A's Constructor Called
B's Constructor Called

3 个答案:

答案 0 :(得分:3)

因为您没有告诉B如何构造其数据成员a,所以它将使用A的默认构造函数。如果A没有默认的构造函数,则可能是编译器错误。要从B的构造函数中调用a的非默认构造函数,请参见以下代码:

#include "iostream"
using namespace std;
class A
{
    public:
    A() { cout << "A's Constructor Called " << endl;  }
    A(int) {  cout << "A's int Constructor Called " << endl;  }
};

class B
{
    A a;
    public:
    B() { cout << "B's Constructor Called " << endl; }
    B(int i) : a(i) { cout << "B's int Constructor Called " << endl; }
};

int main()
{
    B b1;
    B b1(1); // this would call the two new constructors
    return 0;
}

答案 1 :(得分:0)

类B的构造函数初始化该类的所有成员,尤其是A a。由于类A具有构造函数,因此在构造函数中的代码运行之前实例化类B时将调用该类。这意味着构造函数中的代码可以访问B的所有初始化成员。因此,如您所见,B类的对象的构造首先调用A类的对象a的构造,然后给出有关B的输出。构造函数。

答案 2 :(得分:0)

我一直在寻找类似下面的内容,终于能够找出答案。

构造函数用于设置对象的初始状态。对于继承层次结构,将按照继承层次结构(OO术语中的IS-A关系)的顺序构造基类对象,然后再派生类对象。

类似地,当一个对象嵌入另一个对象(OO术语或包含中的HAS-A关系)时,将按照声明的顺序调用嵌入对象的构造函数。

在上述情况下,A嵌入在B中。在构造“ b1”对象之前,将调用A的构造函数以建立状态“ a”。