1、子类和父类 构造、析构函数顺序
class BaseClass
{
public:
BaseClass();
~BaseClass();
private:
};
BaseClass::BaseClass()
{
cout << "基类构造函数" << endl;
}
BaseClass::~BaseClass()
{
cout << "基类析构函数" << endl;
}
class SubClass: public BaseClass
{
public:
SubClass(string name);
SubClass();
~SubClass();
private:
string mName;
};
SubClass::SubClass()
{
cout << "子类构造函数" << endl;
}
SubClass::SubClass(string name)
{
mName = name;
cout << "子类构造函数" << name << endl;
}
int main()
{
SubClass SubClass;
}
输出:
基类构造函数
子类构造函数
子类析构函数
基类析构函数
结论,调用顺序 基类构造函数-》子类构造函数-》子类析构函数-》基类析构函数
2、类成员变量和类本身的构造、析构函数顺序
class ClassA
{
public:
ClassA();
~ClassA();
private:
};
ClassA::ClassA()
{
cout << "ClassA构造函数" << endl;
}
ClassA::~ClassA()
{
cout << "ClassA析构函数" << endl;
}
class ClassB
{
public:
ClassB();
~ClassB();
private:
};
ClassB::ClassB()
{
cout << "ClassB构造函数" << endl;
}
ClassB::~ClassB()
{
cout << "ClassB析构函数" << endl;
}
class CombineClass
{
public:
CombineClass();
~CombineClass();
private:
ClassA classA;
ClassB classB;
};
CombineClass::CombineClass()
{
cout << "组合类构造函数" << endl;
}
CombineClass::~CombineClass()
{
cout << "组合类析构函数" << endl;
}
int main()
{
CombineClass combineClass;
}
输出:
ClassA构造函数
ClassB构造函数
组合类构造函数
组合类析构函数
ClassB析构函数
ClassA析构函数
结论:成员变量构造函数-》类自身构造函数-》类自身析构函数-》成员变量析构函数
成员变量之间构造函数顺序和成员变量在类中定义的顺序一样,析构时反序
3、成员变量有参数,且在主类的构造函数参数列表中做初始化(初始化时的顺序和定义时的顺序不一样)的情况
class ClassA
{
public:
ClassA(string name);
~ClassA();
private:
string mName;
};
ClassA::ClassA(string name)
{
mName = name;
cout << "ClassA构造函数" << endl;
}
ClassA::~ClassA()
{
cout << "ClassA析构函数" << endl;
}
class ClassB
{
public:
ClassB(string name);
~ClassB();
private:
string mName;
};
ClassB::ClassB(string name)
{
mName = name;
cout << "ClassB构造函数" << endl;
}
ClassB::~ClassB()
{
cout << "ClassB析构函数" << endl;
}
class CombineClass
{
public:
CombineClass(string nameA, string nameB);
~CombineClass();
private:
ClassA classA;
ClassB classB;
};
CombineClass::CombineClass(string nameA, string nameB):classB("nameB"), classA("nameA")
{
cout << "组合类构造函数" << endl;
}
CombineClass::~CombineClass()
{
cout << "组合类析构函数" << endl;
}
结果:
ClassA构造函数
ClassB构造函数
组合类构造函数
组合类析构函数
ClassB析构函数
ClassA析构函数
结论:调用顺序还是和声明是的顺序一样,跟初始化的顺序无关