C++构造函数的执行顺序遵循以下规则:
基类构造函数:首先调用基类的构造函数。如果基类没有默认构造函数(无参数的构造函数),则需要显式地调用一个带参数的基类构造函数。
成员变量初始化列表:在基类构造函数调用之后,构造函数将按照成员变量在类定义中的声明顺序初始化类的成员变量。可以使用成员初始化列表来初始化成员变量,这样可以提供更好的性能,并允许对常量和引用类型的成员变量进行初始化。
构造函数体:最后执行构造函数的函数体。在这个阶段,可以执行一些额外的操作,比如分配内存、初始化指针等。
析构函数:当构造函数执行完毕后,对象的析构函数将按照相反的顺序被调用。首先调用派生类的析构函数,然后是基类的析构函数。这是为了确保在对象销毁之前,所有资源都被正确地释放。
以下是一个简单的例子,展示了构造函数的执行顺序:
#include <iostream>
class Base {
public:
Base(int x) : a(x) {
std::cout << "Base constructor called with value: "<< a << std::endl;
}
~Base() {
std::cout << "Base destructor called" << std::endl;
}
private:
int a;
};
class Derived : public Base {
public:
Derived(int x, int y) : Base(x), b(y) {
std::cout << "Derived constructor called with values: "<< a << ", "<< b << std::endl;
}
~Derived() {
std::cout << "Derived destructor called" << std::endl;
}
private:
int b;
};
int main() {
Derived d(1, 2);
return 0;
}
输出结果:
Base constructor called with value: 1
Derived constructor called with values: 1, 2
Derived destructor called
Base destructor called
在这个例子中,首先调用基类Base
的构造函数,然后是派生类Derived
的构造函数。当对象d
被销毁时,析构函数的调用顺序是相反的,首先是派生类的析构函数,然后是基类的析构函数。