参考书籍:
《C++高级编程》(第4版)》
1.Composition(组合)关系下的构造和析构:
构造由内而外:
Container的构造函数首先调用Component的default构造函数,然后才执行自己。
Container::Container(...):Compnent() {...};
析构由外而内:
Container的析构函数首先执行自己,然后才调用Compnent的析构函数。
~Container::Container(...){~Component()};
测试:
Container:
//Container.h
#ifndef GOUZHAOXIGOU_CONTAINER_H
#define GOUZHAOXIGOU_CONTAINER_H
#include <iostream>
#include "Component.h"
class Container {
public:
Container(){
std::cout << "Container构造" << std::endl;
}
~Container(){
std::cout << "Container析构" << std::endl;
}
private:
Component m_component;
};
#endif //GOUZHAOXIGOU_CONTAINER_H
Component:
//Component.h
#ifndef GOUZHAOXIGOU_COMPONENT_H
#define GOUZHAOXIGOU_COMPONENT_H
#include <iostream>
class Component {
public:
Component(){
std::cout << "Component构造" << std::endl;
}
~Component(){
std::cout << "Component析构" << std::endl;
}
};
#endif //GOUZHAOXIGOU_COMPONENT_H
main:
#include "Container.h"
int main() {
Container container;
return 0;
}
测试结果:
2.Inheritance(继承)关系下的构造和析构:
base class 的 dtor 必须是 virtual,否则会出现 undefined behavior
构造由内而外:
Derived的构造函数首先调用Base的default构造函数,然后才执行自己。
Derived::Derived(...):Base(){...};
析构由外而内:
Derived 的析构函数首先执行自己,然后才调用 Base 的析构函数。
Derived::~Derived(...){...~Base()};
测试:
Base:
//Base.h
#ifndef GOUZHAOXIGOU_BASE_H
#define GOUZHAOXIGOU_BASE_H
#include <iostream>
class Base {
public:
Base(){
std::cout << "Base构造" << std::endl;
}
~Base(){
std::cout << "Base析构" << std::endl;
}
};
#endif //GOUZHAOXIGOU_BASE_H
Derived:
//Derived.h
#ifndef GOUZHAOXIGOU_DERIVED_H
#define GOUZHAOXIGOU_DERIVED_H
#include "Base.h"
class Derived : public Base{
public:
Derived(){
std::cout << "Derived构造" << std::endl;
}
~Derived(){
std::cout << "Derived析构" << std::endl;
}
};
#endif //GOUZHAOXIGOU_DERIVED_H
main:
#include "Derived.h"
int main() {
Derived derived;
return 0;
}
测试结果:
3.Inheritance+Composition(继承+组合)关系下的构造和析构:
构造由内而外:
Derived的构造函数首先调用Base的default构造函数,然后调用Component的default构造函数,然后才执行自己。
Derived::Derived(...):Base(){...};
析构由外而内:
Derived的析构函数首先执行自己,然后调用Component的析构函数,然后才调用Base的析构函数。
Derived::~Derived(...)){...~Component(), ~Base()};
测试:
修改Derived:
//Derived.h
#ifndef GOUZHAOXIGOU_DERIVED_H
#define GOUZHAOXIGOU_DERIVED_H
#include "Base.h"
#include "Component.h"
class Derived : public Base{
public:
Derived(){
std::cout << "Derived构造" << std::endl;
}
~Derived(){
std::cout << "Derived析构" << std::endl;
}
private:
Component component;
};
#endif //GOUZHAOXIGOU_DERIVED_H
测试结果:
欢迎关注公众号:c_302888524
发送:“C++高级编程(第3版)” 获取电子书