首页/新闻资讯/正文详情

类和对象(上):一文讲透C++构造函数与析构函数:调用时机+常见坑+代码示例

发布时间:2026/9/24 15:51:05 来源:云帆数科 栏目:资讯中心
类和对象(上):一文讲透C++构造函数与析构函数:调用时机+常见坑+代码示例
前言本篇以Date类和Stack类为例C为什么要引入构造函数和析构函数在C语言的结构体中如果需要初始化成员通常要自己编写一个初始化函数并在定义变量后手动调用它——这一步非常容易遗漏。C引入构造函数使得对象在创建时自动完成初始化无论对象如何定义全局、局部、动态分配构造函数都会被调用从而杜绝了忘记初始化的隐患。对于需要申请资源的类如动态内存、文件句柄等如果资源在对象存活期间被申请必须在对象销毁前释放否则会造成资源泄漏。C引入析构函数它在对象生命周期结束时自动被调用用来释放对象所拥有的资源无论资源是在构造函数还是其他成员函数中申请的。构造函数与析构函数共同支撑了资源获得即初始化机制大大提高了资源管理的安全性和便利性。构造函数的特点构造函数是特殊的成员函数在对象实例化时初始化对象。1.函数名与类名相同2.无返回值指的是真的没有返回值连void也没有3.构造函数可以重载对象在实例化时会调用对应的构造函数4.如果类中没有显式地定义了构造函数则编译器会自动生成一个没有参数的默认构造函数一旦你自己定义了一个构造函数则编译器不再生成5.默认构造函数不单单指编译器自动生成的构造函数还指我们自定义的无参构造函数和全缺省构造函数默认构造函数本质上就是指不传参数就可以被调用的构造函数class Date { public: Date(int year2026,int month5,int day18) { _yearyear; _monthmonth; _dayday; } private: int _year; int _month; int _day; }6. 对于同时包含内置类型和自定义类型成员的类如果我们不自定义任何构造函数由编译器自动生成的默认构造函数会对内置类型成员不进行初始化保留随机值除非成员有类内初始值对自定义类型成员调用它们各自的默认构造函数进行初始化。因此如果我们需要初始化内置类型成员或者希望类支持无参构造通常应该自定义构造函数并且建议同时提供默认构造函数例如typedef int STDataType; class Stack { public: Stack(int n 4) { //初始化 } //... private: STDataType* _a; size_t _capacity; size_t _top; }; // 两个Stack实现队列 class MyQueue { //... Stack pushst; Stack popst; }; int main() { MyQueue q;//编译器默认⽣成MyQueue的构造函数调⽤了Stack的构造完成了两个成员的初始化 return 0: }析构函数的特点1.析构函数名是在类名前加上字符~2.无参数无返回值与构造函数相似连void也没有3.一个类只能有一个析构函数与构造函数不同4.若用户未显式定义析构函数编译器会自动生成一个默认的析构函数在对象生命周期结束时系统会自动调用析构函数。5.对于包含自定义类型成员变量的类当对象被销毁时这些成员变量都会自动调用它们自己的析构函数——无论该类的析构函数是用户自定义的还是编译器默认生成的。6.如果类中有资源申请时一定要自定义一个析构函数否则会造成内存泄漏。7.一个局部域的多个对象C规定后定义的析构。例如class Date { Date(....) { //... } ~Date() { //... } } int main() { Date d1; Date d2; return 0 }main函数结束后调用构造函数和析构函数的顺序分别为d1、d2和d2、d1。总结构造函数与析构函数是C类管理对象生命周期和资源的核心工具。构造函数保证对象在创建时必然初始化杜绝了C语言中手动调用初始化函数容易遗漏的问题。析构函数保证对象在销毁时自动释放资源配合RAII思想从根本上避免资源泄漏一句话记住它们构造函数负责“得到”析构函数负责“归还”——C用对象的生与死自动管好每一份资源。

相关推荐

Hive 生产级 AI 智能体中的 YouTube 数据工具:YouTube Data API v3 MCP 工具集实战指南
Hive 生产级 AI 智能体中的 YouTube 数据工具:YouTube Data API v3 MCP 工具集实战指南

Hive 生产级 AI 智能体中的 YouTube 数据工具:YouTube Data API v3 MCP 工具集实战指南 【免费下载链接】hive Multi-Agent Harness for Production AI 项目地址: https://gitcode.com/gh_mirrors/hive48/hive 本指南围绕 Hive 仓库中 Aden Tools 的 youtube… · 2026/9/24 15:51:05

PostGraphile v5 CRUD Mutations 全指南:自动生成的增删改查、行为禁用与故障排查
PostGraphile v5 CRUD Mutations 全指南:自动生成的增删改查、行为禁用与故障排查

后端API网关 【免费下载链接】crystal 🔮 Graphiles Crystal Monorepo; home to Grafast, PostGraphile, pg-introspection, pg-sql2 and much more! 项目地址: https://gitcode.com/gh_mirrors/cry/crystal 点击查看 免费下载 本文是一份聚焦 PostGrap… · 2026/9/24 15:50:59

HyperDX @hyperdx/app 2.39 系列演进全解析:从 LLM 可观测性到 ClickHouse 查询优化的开源前端平台
HyperDX @hyperdx/app 2.39 系列演进全解析:从 LLM 可观测性到 ClickHouse 查询优化的开源前端平台

可观测性云原生运维 【免费下载链接】hyperdx Resolve production issues, fast. An open source observability platform unifying session replays, logs, metrics, traces and errors powered by ClickHouse and OpenTelemetry. 项目地址: https://gitcode.com/g… · 2026/9/24 15:50:59

TV直播应用内存泄漏四步排查:my-tv 从卡顿到丝滑
TV直播应用内存泄漏四步排查:my-tv 从卡顿到丝滑

TV直播应用内存泄漏四步排查:my-tv 从卡顿到丝滑 【免费下载链接】my-tv 我的电视 电视直播软件,安装即可使用 项目地址: https://gitcode.com/GitHub_Trending/my/my-tv 深夜追直播,换台两小时后,遥控器按三下才有一下反应… · 2026/9/24 16:28:06

RedwoodJS 禁用 API 层与数据库:纯静态站点部署实战指南
RedwoodJS 禁用 API 层与数据库:纯静态站点部署实战指南

后端前端Web框架开发工具 【免费下载链接】redwood RedwoodGraphQL 项目地址: https://gitcode.com/gh_mirrors/re/redwood 点击查看 免费下载 本文以 RedwoodJS 为背景,完整讲解如何在不使用 API 层与数据库的前提下,将一个 Redwood 项目改… · 2026/9/24 16:28:06

Relay 交互查询实战:用 Query Variables 与 Preloaded Queries 优化二次数据获取
Relay 交互查询实战:用 Query Variables 与 Preloaded Queries 优化二次数据获取

前端开发工具 【免费下载链接】relay Relay is a JavaScript framework for building data-driven React applications. 项目地址: https://gitcode.com/gh_mirrors/relay29/relay 点击查看 免费下载 本指南源自 Relay 官方教程系列(website/versioned_… · 2026/9/24 16:27:47

protobuf-format-cj 快速开始:5分钟从编译构建到第一个 Protobuf JSON 序列化示例
protobuf-format-cj 快速开始:5分钟从编译构建到第一个 Protobuf JSON 序列化示例

protobuf-format-cj 快速开始:5分钟从编译构建到第一个 Protobuf JSON 序列化示例 【免费下载链接】protobuf-format-cj 根据 protobuf 数据,提供不同格式的序列化 项目地址: https://gitcode.com/Cangjie-TPC/protobuf-format-cj protobuf-forma… · 2026/9/24 16:27:47

Wand-Enhancer新手指南:给WeMod客户端打上本地补丁的5步教程
Wand-Enhancer新手指南:给WeMod客户端打上本地补丁的5步教程

Wand-Enhancer新手指南:给WeMod客户端打上本地补丁的5步教程 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 给WeMod打补丁这件事&… · 2026/9/24 16:27:47

EMQX A2A Registry 命名空间格式化修复解析:HTTP API 中全局命名空间如何以 `null` 呈现
EMQX A2A Registry 命名空间格式化修复解析:HTTP API 中全局命名空间如何以 `null` 呈现

后端物联网消息队列通信 【免费下载链接】emqx The most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 点击查看 免费下载 A2A(Agent-to-Agent)Registry… · 2026/9/24 16:27:41

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码