C++中类成员的构造函数和析构函数顺序是一个重要的问题。理解正确的顺序可以避免代码出现意外的问题。在这里,我们会详细讲解C++类成员构造函数和析构函数顺序的相关知识。
构造函数和析构函数的顺序
C++中类成员的构造函数和析构函数的顺序如下:
- 首先,会调用基类的构造函数(如果有的话)。
- 然后,会调用成员变量的构造函数(按照它们在类中的声明顺序调用)。
- 最后,调用自身的构造函数。
在析构时的顺序是相反的,即:
- 首先,调用自身的析构函数。
- 然后,调用成员变量的析构函数(按照它们在类中的声明顺序相反的顺序调用)。
- 最后,调用基类的析构函数(如果有的话)。
示例说明
接下来,我们会使用两个示例来说明构造函数和析构函数的顺序。
示例一
#include <iostream>
class Base
{
public:
Base()
{
std::cout << "Base::Base()" << std::endl;
}
~Base()
{
std::cout << "Base::~Base()" << std::endl;
}
};
class MemberVariable
{
public:
MemberVariable()
{
std::cout << "MemberVariable::MemberVariable()" << std::endl;
}
~MemberVariable()
{
std::cout << "MemberVariable::~MemberVariable()" << std::endl;
}
};
class Derived : public Base
{
public:
Derived()
{
std::cout << "Derived::Derived()" << std::endl;
}
~Derived()
{
std::cout << "Derived::~Derived()" << std::endl;
}
private:
MemberVariable member_;
};
int main()
{
Derived derived;
return 0;
}
输出结果为:
Base::Base()
MemberVariable::MemberVariable()
Derived::Derived()
Derived::~Derived()
MemberVariable::~MemberVariable()
Base::~Base()
从输出结果可以看出,构造函数按照规定的顺序被调用,先调用Base类的构造函数,再调用成员变量的构造函数,最后调用自身的构造函数。析构时调用的顺序正好相反。
示例二
#include <iostream>
class String
{
public:
String(const char* str)
: len_(strlen(str))
, str_(new char[len_ + 1])
{
strcpy_s(str_, len_ + 1, str);
std::cout << "String::String()" << std::endl;
}
~String()
{
delete[] str_;
std::cout << "String::~String()" << std::endl;
}
private:
size_t len_;
char* str_;
};
class Person
{
public:
Person(const char* name)
: name_(name)
{
std::cout << "Person::Person()" << std::endl;
}
~Person()
{
std::cout << "Person::~Person()" << std::endl;
}
private:
String name_;
};
int main()
{
Person person("tianxia");
return 0;
}
输出结果为:
String::String()
Person::Person()
Person::~Person()
String::~String()
从输出结果可以看出,成员变量的构造函数先被调用,然后是自身的构造函数。在析构时,先调用自身的析构函数,然后是成员变量的析构函数。
总结
在C++中,类成员的构造函数和析构函数的顺序比较重要,正确的理解可以避免代码出现意外的问题。在构造时,会按照先调用基类构造函数,再调用成员变量构造函数,最后调用自身构造函数的顺序进行调用;在析构时,会按照先调用自身析构函数,然后调用成员变量析构函数(按照它们在类中的声明顺序相反的顺序调用),最后调用基类析构函数(如果有的话)的顺序进行调用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类成员构造函数和析构函数顺序示例详细讲解 - Python技术站