先调用哪个构造函数

Which constructor is called first?

本文关键字:构造函数 调用      更新时间:2023-10-16

我看过类似的查询,但我似乎迷失了方向。我有一个简单的例子,所以请考虑以下内容:

#include <iostream>
using namespace std;
class Animal
{
  public:
    Animal() {cout << "Animal" << endl;}
};
class Cat : public Animal
{
  public:
    Cat() {cout << "Cat" << endl;};
};
int main()
{
  Cat c;
  return 0;
}

当程序运行时,它显示

Animal
Cat

我现在的问题是:哪一个构造函数实际上首先被调用。在执行其内容之前是否调用了Cat(),然后Cat()调用了Animal()或者编译器/程序是否查看Cat()是否为Animal),并先调用Animal,然后再调用Cat()?

调用Cat构造函数时,Animal构造函数在Cat构造函数体之前执行,作为Cat对象初始化的一部分。这与您在初始化列表中明确执行此操作相同:

Cat () : Animal() {
     cout << "Cat" << endl;
}

如果要将参数传递给基类构造函数,则必须如上所述显式执行,否则将调用默认构造函数(不带参数的构造函数)。在任何一种情况下,基类构造函数都会在派生对象的初始化继续之前完成。

当调用Cat构造函数时,会发生两件事,首先执行初始化列表,然后执行构造函数。暗示你正在这样做:

class Cat : public Animal
{
  public:
    Cat() 
    : Animal()
    {
        cout << "Cat" << endl;
    };
};

然后Animal构造函数在Cat构造函数的Cat实现之前执行,但在它初始化列表之后执行。例如,如果Cat和Animal类有一些成员,并且你想在构造函数中初始化它们,你可以更容易地看到:

class Animal
{
  private:
    bool haveHair;
  public:
    Animal(bool hair)
    :    haveHair(hair)
    {
        cout << "Animal" << endl;
    }
};
class Cat : public Animal
{
  public:
    Cat() 
    : Animal(true)
    {
        cout << "Cat" << endl;
    }
};

首先调用Animal(),然后调用Cat。

首先是Animal类分配内存,然后是Cat。也许你想在Cat构造函数中访问Animal的资源。