news 2026/8/18 4:29:49

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/8/17 20:37:13

别再错过收益波动!构建你的专属Open-AutoGLM收益预警系统(附源码)

第一章&#xff1a;Open-AutoGLM收益预警系统概述Open-AutoGLM收益预警系统是一套基于大语言模型与自动化数据处理技术构建的智能监控平台&#xff0c;专为金融、投资及企业财务场景设计。系统通过实时采集多源异构数据&#xff0c;结合自然语言理解能力&#xff0c;动态识别潜…

作者头像 李华
网站建设 2026/8/16 8:33:27

基于Flink的实时大数据异常检测系统设计与实现

基于Flink的实时大数据异常检测系统设计与实现 关键词&#xff1a;Flink流处理、实时异常检测、状态管理、窗口计算、大数据系统设计 摘要&#xff1a;在金融风控、物联网设备监控、服务器日志分析等场景中&#xff0c;实时发现异常数据是保障系统安全和业务稳定的关键。传统批…

作者头像 李华
网站建设 2026/8/17 22:09:54

CSP月测试卷三

一、选择题&#xff08;共15题&#xff0c;每题4分&#xff0c;满分60分&#xff09;请将正确答案的序号填入答题栏&#xff0c;多选、错选、不选均不得分。1、已知某二叉树的前序序列为ABCDEF&#xff0c;中序序列为BADCFE&#xff0c;则其后序序列为&#xff08;&#xff09;…

作者头像 李华
网站建设 2026/8/17 12:37:49

【医疗AI新突破】:Open-AutoGLM如何实现个性化用药提醒?

第一章&#xff1a;Open-AutoGLM 用药时间提醒Open-AutoGLM 是一个基于大语言模型的自动化任务调度框架&#xff0c;能够结合自然语言理解与时间触发机制&#xff0c;实现个性化的用药提醒服务。该系统通过解析用户输入的自然语言描述&#xff08;如“每天上午9点和晚上7点提醒…

作者头像 李华
网站建设 2026/8/18 6:57:15

校园IT负责人必看:Open-AutoGLM如何解决传统预约系统的4大痛点?

第一章&#xff1a;校园IT负责人必看&#xff1a;Open-AutoGLM如何解决传统预约系统的4大痛点&#xff1f;在高校信息化建设中&#xff0c;传统的实验室、会议室和设备预约系统长期面临响应慢、管理复杂、资源冲突频发等问题。Open-AutoGLM作为基于开源大模型的智能调度引擎&am…

作者头像 李华
网站建设 2026/8/17 19:14:38

政务AI革命已来:Open-AutoGLM助力基层工作人员减负80%(附实测数据)

第一章&#xff1a;政务AI革命已来&#xff1a;Open-AutoGLM的时代背景与战略意义人工智能正以前所未有的速度重塑政府治理模式。在数字化转型的浪潮中&#xff0c;政务AI不再仅仅是效率工具&#xff0c;而是成为推动国家治理体系现代化的核心引擎。Open-AutoGLM作为面向政务场…

作者头像 李华