C++高级编程(第4版) 个人笔记 - 关于构造和析构

参考书籍:
《C++高级编程》(第4版)》
在这里插入图片描述


1.Composition(组合)关系下的构造和析构:

在这里插入图片描述
在这里插入图片描述

构造由内而外:

Container的构造函数首先调用Componentdefault构造函数,然后才执行自己。

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 classdtor 必须是 virtual,否则会出现 undefined behavior

构造由内而外:

Derived的构造函数首先调用Basedefault构造函数,然后才执行自己。

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的构造函数首先调用Basedefault构造函数,然后调用Componentdefault构造函数,然后才执行自己。

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版)” 获取电子书
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值