news 2026/6/10 14:10:24

C++类的构造顺序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++类的构造顺序

1. C++ 类成员与自身的构造和析构顺序

  1. 默认先构造类成员(类成员的构造顺序就是类成员在类中被书写的顺序),然后再构造类本身。参看 “测试代码 1”。
  2. 默认先析构类本身,然后再析构类成员(类成员的析构顺序就是类成员在类中被书写顺序的反顺序)。参看 “测试代码 1”。
  3. 如果类成员在类的构造函数中才被初始化,那么就是先调用类自身的构造函数,然后再按类成员在构造函数中的初始化顺序依次构造类成员。但是析构顺序总是先析构类本身,然后再析构类成员(类成员的析构顺序就是类成员在类中被书写顺序的反顺序)。参看 “测试代码 2”。
  4. 可以使用智能指针,并在类的析构函数中调用智能指针的reset函数显式更改类成员之间的析构顺序,以及类成员和类本身的析构顺序。参看 “测试代码 3”。

1.1. 测试代码 1

#include<iostream>usingnamespacestd;classA{public:A(){cout<<"constructor A"<<endl;}~A(){cout<<"destructor A"<<endl;}};classB{public:B(){cout<<"constructor B"<<endl;}~B(){cout<<"destructor B"<<endl;}};classC{public:C(){cout<<"constructor C"<<endl;}~C(){cout<<"destructor C"<<endl;}private:A a;B b;};intmain(){C c;return0;}

输出:

constructor A constructor B constructor C destructor C destructor B destructor A

1.2. 测试代码 2

#include<iostream>#include<memory>#include<utility>usingnamespacestd;classA{public:A(){cout<<"constructor A"<<endl;}~A(){cout<<"destructor A"<<endl;}};classB{public:B(){cout<<"constructor B"<<endl;}~B(){cout<<"destructor B"<<endl;}};classC{public:C(){cout<<"constructor C"<<endl;b=std::make_unique<B>();a=std::make_unique<A>();}~C(){cout<<"destructor C"<<endl;}private:A a1;unique_ptr<A>a;unique_ptr<B>b;};intmain(){unique_ptr<C>c=std::make_unique<C>();return0;}

输出:

constructor A constructor C constructor B constructor A destructor C destructor B destructor A destructor A

1.3. 测试代码 3

#include<iostream>#include<memory>#include<utility>usingnamespacestd;classA{public:A(){cout<<"constructor A"<<endl;}~A(){cout<<"destructor A"<<endl;}};classB{public:B(){cout<<"constructor B"<<endl;}~B(){cout<<"destructor B"<<endl;}};classC{public:C(){cout<<"constructor C"<<endl;a=std::make_unique<A>();b=std::make_unique<B>();}~C(){cout<<"destructor C"<<endl;a.reset();b.reset();}private:unique_ptr<A>a;unique_ptr<B>b;};intmain(){unique_ptr<C>c=std::make_unique<C>();return0;}

输出:

constructor C constructor A constructor B destructor C destructor A destructor B

2. C++ 父类和子类的构造和析构顺序

对象在创建时构造函数的调用顺序:

  1. 调用父类的构造函数;
  2. 调用成员变量的构造函数;
  3. 调用类自身的构造函数。

子类对象析构时的顺序(析构函数的调用顺序与构造函数相反):
2. 执行自身的析构函数;
3. 执行成员变量的析构函数;
4. 执行父类的析构函数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 12:31:59

Open-AutoGLM待办同步架构深度拆解,99%的人都忽略的关键节点

第一章&#xff1a;Open-AutoGLM待办同步架构概述Open-AutoGLM 是一个面向自动化任务生成与管理的开源框架&#xff0c;其核心功能之一是实现跨平台待办事项的实时同步。该架构通过模块化设计&#xff0c;将任务采集、语义解析、调度执行与状态回传解耦&#xff0c;提升系统的可…

作者头像 李华
网站建设 2026/6/8 1:26:44

【企业级保险监控方案】:基于Open-AutoGLM的7×24小时到期预警系统搭建

第一章&#xff1a;Open-AutoGLM 保险到期提醒在现代车辆管理系统中&#xff0c;自动化提醒功能对于保障用户权益至关重要。Open-AutoGLM 是一个开源的车载智能管理框架&#xff0c;支持通过自然语言理解与规则引擎结合的方式&#xff0c;实现对车辆保险状态的实时监控与主动提…

作者头像 李华
网站建设 2026/6/3 12:13:06

单片机如何控制电机

单片机作为嵌入式系统的核心&#xff0c;通过精准控制算法与外围电路结合&#xff0c;实现对电机的高效调控。本文聚焦实战要点&#xff0c;提炼关键技术框架。1. 控制方式PWM调速&#xff1a;通过调节脉冲宽度占空比控制电机转速&#xff0c;实现无级调速。H桥驱动&#xff1a…

作者头像 李华
网站建设 2026/6/9 22:45:48

【Open-AutoGLM会议纪要生成全攻略】:3大核心技术揭秘与落地实践

第一章&#xff1a;Open-AutoGLM会议纪要生成的核心价值在现代企业协作环境中&#xff0c;会议作为信息交换与决策制定的核心场景&#xff0c;其效率直接影响组织运转速度。Open-AutoGLM 通过大语言模型驱动的自动化技术&#xff0c;将语音转录、语义理解与结构化输出深度融合&…

作者头像 李华
网站建设 2026/6/10 14:17:57

Open-AutoGLM如何重塑公积金提取体验:8步自动化流程全公开

第一章&#xff1a;Open-AutoGLM 公积金提取辅助在智能政务与自动化办公场景中&#xff0c;Open-AutoGLM 作为一款基于开源大语言模型的智能助手框架&#xff0c;能够高效支持公积金提取流程的自动化辅助。通过自然语言理解与结构化数据解析能力&#xff0c;该系统可自动识别用…

作者头像 李华