news 2026/6/8 14:13:15

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/8 7:53:09

为什么99%的政务拍照点都在接入Open-AutoGLM?真相令人震惊

第一章&#xff1a;为什么99%的政务拍照点都在接入Open-AutoGLM&#xff1f;真相令人震惊在数字化政务加速推进的今天&#xff0c;全国范围内超过99%的政务拍照点正悄然接入一个名为 Open-AutoGLM 的智能图像识别系统。这一现象背后&#xff0c;并非偶然的技术选型&#xff0c;…

作者头像 李华
网站建设 2026/6/7 10:36:48

8 个降AI率工具推荐,研究生必备!

8 个降AI率工具推荐&#xff0c;研究生必备&#xff01; AI降重工具&#xff1a;论文写作的“隐形助手” 随着人工智能技术在学术领域的广泛应用&#xff0c;越来越多研究生在撰写论文时不得不面对一个现实问题——如何降低AIGC率&#xff0c;同时保持文章的逻辑性和可读性。传…

作者头像 李华
网站建设 2026/6/8 12:36:35

hot100 238.除自身以外的数组的乘积

思路&#xff1a;一、前后缀分解1.answer[i]等于nums中除了nums[i]之外的其余各元素的乘积。换句话说&#xff0c;如果知道了i左边所有数的乘积&#xff0c;以及i右边所有数的乘积&#xff0c;就可以算出answer[i]。2.定义pre[i]和post[i]&#xff1a;&#xff08;1&#xff09…

作者头像 李华
网站建设 2026/6/8 3:36:40

医院挂号难终结者(Open-AutoGLM技术深度解析)

第一章&#xff1a;医院挂号难终结者&#xff08;Open-AutoGLM技术深度解析&#xff09;在医疗资源紧张的背景下&#xff0c;医院挂号难长期困扰患者。Open-AutoGLM 技术应运而生&#xff0c;通过融合自然语言理解与自动化调度系统&#xff0c;实现智能分诊、动态号源分配和实时…

作者头像 李华
网站建设 2026/6/1 23:43:13

【Java毕设全套源码+文档】基于springboot的大学生家教管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/8 2:55:00

【内部流出】Open-AutoGLM工程师亲授:高优先级工单生成秘诀

第一章&#xff1a;Open-AutoGLM 维修服务预约Open-AutoGLM 是一个基于大语言模型驱动的智能汽车维修服务平台&#xff0c;专为车主提供高效、精准的维修预约与服务推荐。该系统通过自然语言理解技术解析用户需求&#xff0c;自动匹配最近的维修站点并完成预约流程。服务接入方…

作者头像 李华