当前位置: 首页 > article >正文

C++默认成员函数

构造函数构造函数是特殊的成员函数需要注意的是构造函数虽然名称叫构造但是构造函数的主要任务并不是开空间创建对象(局部对象在栈帧创建时空间就开好了)而是对象实例化时初始化对象。构造函数的本质是要替代我们以前Stack和Date类中写的Init函数的功能构造函数自动调用的特点就完美的替代的了Init。 构造函数有如下特点 1. 函数名与类型同名 2. 可以重载 3. 没有返回值不用写void 4. 如果用户没有显式写构造函数编译器会生成一个默认的无参构造函数一旦用户显式定义编译器将不再生成。代码语言javascriptAI代码解释// 构造函数 // 1. 函数名和类名同名 2. 可以重载 3. 没有返回值 4. 用户不写编译器会默认生成无参的构造函数 class Date { public: // 无参构造 Date() { _year 1; _month 1; _day 1; } // 带参数构造 Date(size_t year, size_t month, size_t day) { _year year; _month month; _day day; } //// 全缺省构造 //Date(size_t year 1, size_t month 1, size_t day 1) //{ // _year year; // _month month; // _day day; //} // void Print() { cout _year - _month - _day endl; } private: size_t _year; size_t _month; size_t _day; }; int main() { // 调用带参数的构造 Date d1(2025,7,5); d1.Print(); //// 无参构造和全缺省构造会产生调用歧义 //Date d2; //d2.Print(); // 无参的不能这么写 会和函数声明搞混 eg: void func // 这是函数声明还是函数定义呢 /*Date d2(); d2.Print();*/ //// 如果注释掉无参的构造和全缺省构造会报错 //// C2512 没有合适的默认构造函数可用 //Date d2; //d2.Print(); // 调用无参的构造函数 Date d3; d3.Print(); return 0; }默认构造函数分为三类全缺省构造函数无参构造函数编译器默认生成的构造函数总结一下不传参的构造函数就是默认构造函数这三个函数不能同时存在 而全缺省构造函数和无参构造函数虽然构成函数重载但是调用时会产生调用歧义我们不显式写构造函数编译器默认生成的构造函数会如何处理数据代码语言javascriptAI代码解释using namespace std; class Time { public: Time() { _hour 1; _minute 1; _second 1; } private: size_t _hour; size_t _minute; size_t _second; }; class Date { public: // 不写构造函数 编译器会自动生成默认构造函数 // 对于内置类型 编译器是否处理没有明确要求 // 对于自定义类型 调用该类型的默认构造函数 void Print() { cout _year - _month - _day endl; } private: size_t _year; size_t _month; size_t _day; Time _t; }; int main() { Date d1; d1.Print(); return 0; }在这里插入图片描述观察调试结果我们可以得到如下结论 对于编译器默认生成的构造函数处理不同类型数据有不同行为对于内置类型编译器没有特别要求对于VS环境给出随机值对于自定义类型该类型会调用它默认的构造函数 如果把Time类的无参构造函数注释掉会有如下现象在这里插入图片描述Time类调用它的默认构造函数而Time类的默认构造函数是编译器生成的又是处理内置类型所以VS不做处理给出随机值 针对这个问题C11打了个补丁内置类型成员变量在声明时给缺省值用缺省值初始化代码语言javascriptAI代码解释using namespace std; class Time { public: /*Time() { _hour 1; _minute 1; _second 1; }*/ private: // C11 在声明时给缺省值 size_t _hour 1; size_t _minute 1; size_t _second 1; }; class Date { public: // 不写构造函数 编译器会自动生成默认构造函数 // 对于内置类型 编译器是否处理没有明确要求 // 对于自定义类型 调用该类型的默认构造函数 void Print() { cout _year - _month - _day endl; } private: // C11 在声明时给缺省值 size_t _year 1; size_t _month 1; size_t _day 1; Time _t; }; int main() { // 此时 Time类和Date类只有编译器默认生成的构造函数 Date d1; d1.Print(); return 0; }![[Pasted image 20250707095835.png]]总结什么时候要显式定义构造函数一般情况构造函数都要显式实现只有成员全为自定义类型的类不用显式实现3. 析构函数析构函数与构造函数功能相反析构函数不是完成对对象本身的销毁比如局部对象是存在栈帧的函数结束栈帧销毁他就释放了不需要我们管C规定对象在销毁时会自动调用析构函数完成对象中资源的清理释放工作。析构函数的功能类比我们之前Stack实现的Destroy功能而像Date没有Destroy其实就是没有资源需要释放所以严格说Date是不需要析构函数的 析构函数有如下特点 1. 函数名和类名相同在函数名前加~2. 没有返回值 3. 不能重载意味着一个类只有一个析构函数 4. 如果用户没有显式写编译器会默认生成析构函数 5. 对象的生命周期结束编译器自动调用析构函数代码语言javascriptAI代码解释class Stack { public: Stack(size_t n 4) { cout Stack(size_t n 4) 析构 endl; _arr (int*)malloc(sizeof(int) * n); if (_arr nullptr) { perror(malloc err!); return; } _capacity n; _top 0; } ~Stack() { cout ~Stack() 析构 endl; assert(_arr); free(_arr); _arr nullptr; _capacity _top 0; } private: int* _arr; int _capacity; int _top; }; int main() { Stack st1; return 0; }和构造函数一样如果我们不显式实现析构函数编译器生成的析构函数对于内置类型不做处理对于定义类型会调用它的析构函数值得一提的是是我们显式写析构函数对于自定义类型成员也会调用他的析构也就是说自定义类型成员无论什么情况都会自动调用析构函数代码语言javascriptAI代码解释class tmp { public: ~tmp() { cout ~tmp() 析构 endl; } private: int _num; }; class Stack { public: Stack(size_t n 4) { cout Stack(size_t n 4) 构造 endl; _arr (int*)malloc(sizeof(int) * n); if (_arr nullptr) { perror(malloc err!); return; } _capacity n; _top 0; } /*~Stack() { cout ~Stack() 析构 endl; assert(_arr); free(_arr); _arr nullptr; _capacity _top 0; }*/ private: int* _arr; int _capacity; int _top; tmp _t; }; int main() { Stack st1; return 0; }我们可以通过调试观察在这里插入图片描述总结什么时候需要显式实现析构函数有资源需要清理就必须写析构函数例如StackList…无资源要清理可以不写内置类型成员没有资源要清理剩下全是自定义类型可以不写 还有一个重要的点一个局部域的多个对象后定义的先析构代码语言javascriptAI代码解释设已经有A,B,C,D4个类的定义程序中A,B,C,D析构函数调用顺序为 C c; int main() { A a; B b; static D d; return 0 }类的析构函数调用一般按照构造函数调用的相反顺序进行调用但是要注意static对象的存在 因为static改变了对象的生存作用域需要等待程序结束时才会析构释放对象全局对象先于局部对象进行构造局部对象按照出现的顺序进行构造无论是否为static所以构造的顺序为c a b d析构的顺序按照构造的相反顺序析构只需注意static改变对象的生存作用域之后会放在局部对象之后进行析构因此析构顺序为B A D C4. 拷贝构造函数拷贝构造函数的第一个参数是自身类型的引用且任何额外的参数都有缺省值这样的函数叫做拷贝构造函数用于同类对象的拷贝初始化是构造函数的重载。 本文以最常规情况的拷贝构造函数展开即有且仅有一个参数类类型对象的引用拷贝构造函数有如下特点拷贝构造函数是构造函数的一个重载拷贝构造函数的第一个参数必须是类类型对象的引用使用传值方式编译器会报错会引发无穷递归调用拷贝构造函数也可以多个参数但是第⼀个参数必须是类类型对象的引用后面的参数必须有缺省值代码语言javascriptAI代码解释// 拷贝构造函数 // 构造函数的重载第一个参数必须是类类型对象的引用 // 用于同类对象的拷贝初始化 class Date { public: Date() { _year 1; _month 1; _day 1; } Date(Date d) { cout call Date(Date d) endl; _year d._year; _month d._month; _day d._day; } void Print() { cout _year - _month - _day endl; } private: size_t _year; size_t _month; size_t _day; }; int main() { Date d1; // 两种写法都可以 Date d2 d1; // d是d1的别名d3是this指针 Date d3(d1); d1.Print(); d2.Print(); d3.Print(); return 0; }再来看一段代码代码语言javascriptAI代码解释Date(Date d) { cout call Date(Date d) endl; // 如果不小心写反了会发生什么 d._year _year; d._month _month; d._day _day; }其余部分不变在这里插入图片描述初始的d1也被修改成随机值了我们进行拷贝构造提供拷贝值的对象是不能被修改的所以为了防止这样的情况发生我们做如下处理Date(const Date d)保证d的只读性代码语言javascriptAI代码解释// 拷贝构造函数 // 构造函数的重载第一个参数必须是类类型对象的引用 // 用于同类对象的拷贝初始化 class Date { public: Date() { _year 1; _month 1; _day 1; } Date(const Date d) { cout call Date(Date d) endl; _year d._year; _month d._month; _day d._day; } void Print() { cout _year - _month - _day endl; } private: size_t _year; size_t _month; size_t _day; }; int main() { Date d1; // 两种写法都可以 Date d2 d1; // d是d1的别名d3是this指针 Date d3(d1); d1.Print(); d2.Print(); d3.Print(); return 0; }C规定自定义类型对象进行拷贝行为必须调用拷贝构造所以自定义类型传值传参和传值返回都会调用拷贝构造

相关文章:

C++默认成员函数

构造函数构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(局部对象在栈帧创建时,空间就开好了),而是对象实例化时初始化对象。构造函数的本质是要替代我们…...

从质谱数据到生物学洞察:MZmine3如何重新定义代谢组学分析效率

从质谱数据到生物学洞察:MZmine3如何重新定义代谢组学分析效率 【免费下载链接】mzmine3 mzmine source code repository 项目地址: https://gitcode.com/gh_mirrors/mz/mzmine3 在当今代谢组学研究中,科研人员面临着从海量质谱数据中提取生物学意…...

Topit:重构macOS多窗口工作流的开源利器

Topit:重构macOS多窗口工作流的开源利器 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 在日益复杂的数字工作环境中,macOS用户经常面临…...

智能护理床控制板开发:从单片机到机电一体化的实战解析

1. 项目概述:从手动到智能,一款控制板如何重塑护理体验在康复护理和老年照护领域,一张床不仅仅是休息的地方,它更是使用者维持尊严、促进康复、保障安全的重要工具。传统的护理床依赖手动摇杆,每一次姿势调整都需要护理…...

Zephyr RTOS在ESP32-C3上的移植实践:从环境搭建到JTAG调试

1. 项目概述:当Zephyr RTOS遇上ESP32-C3最近拿到了一块MuseLab出品的nanoESP32-C3开发板,这块板子挺有意思,自带了一个基于DAPlink的ESPLink调试器。正好看到Zephyr RTOS的主线代码刚刚合并了对ESP32-C3这颗RISC-V芯片的初步支持,…...

d2dx:让经典《暗黑破坏神2》在现代PC上重获新生的魔法引擎

d2dx:让经典《暗黑破坏神2》在现代PC上重获新生的魔法引擎 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 还记得…...

同花顺问财数据获取终极指南:Python量化分析的高效解决方案

同花顺问财数据获取终极指南:Python量化分析的高效解决方案 【免费下载链接】pywencai 获取同花顺问财数据 项目地址: https://gitcode.com/gh_mirrors/py/pywencai 在金融数据分析和量化投资领域,获取实时、准确的股票数据是每个分析师面临的核心…...

告别城通网盘限速:三步获取高速直连地址的终极方案

告别城通网盘限速:三步获取高速直连地址的终极方案 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘下载时的漫长等待和龟速下载而烦恼吗?每次打开分享链接&#x…...

创业团队如何利用多模型聚合平台优化AI应用开发成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 创业团队如何利用多模型聚合平台优化AI应用开发成本 对于资源有限的创业团队或独立开发者而言,在开发智能客服、内容生…...

ARM指令集MOV与RRX操作详解

1. ARM指令集基础与MOV指令概述在嵌入式系统和移动计算领域,ARM架构凭借其精简指令集(RISC)设计占据了主导地位。作为程序员或系统开发者,理解ARM指令集的工作原理至关重要。MOV(数据移动)指令作为最基础的数据传输指令,其看似简单的表面下隐…...

轻松管理Android设备的最佳 HiSuite 替代品

HiSuite 是由华为开发的一款 PC 套件,旨在通过 USB 或 Wi-Fi 管理华为手机。虽然它与华为设备配合良好,但也存在一些局限性,例如不支持其他Android品牌、云集成程度低以及偶尔出现的兼容性问题。如果您正在寻找功能更丰富或更人性化的方案&am…...

如何在没有计算机的情况下恢复Android上已删除的文件

意外从Android设备中删除重要文件可能会给您带来压力,但了解如何在没有计算机的情况下在Android上恢复已删除的文件可以节省您的时间和麻烦。幸运的是,有多种方法可以直接从手机恢复丢失的数据,无需计算机。从使用“最近删除”文件夹到利用 G…...

ARM Cortex-M4嵌入式开发实战:内存管理与性能优化全解析

1. 项目概述:为什么M4的性能与内存管理值得深究如果你从经典的AVR平台(比如Arduino Uno)转向基于ARM Cortex-M4的板子(比如Adafruit的Feather M4 Express或Arduino Zero),最初的体验可能是“性能过剩”。毕…...

基于MCP协议构建AI助手与开发环境的安全桥梁:Merx MCP实战指南

1. 项目概述:一个为开发者服务的“智能副驾”最近在折腾一个内部工具链的自动化项目,发现很多重复性的查询、数据转换和文档生成工作,虽然能写脚本解决,但每次都要翻找不同的API文档和命令行工具,效率很低。就在这个当…...

CircuitPython库管理全攻略:从导入错误到高效项目构建

1. 项目概述与核心价值 如果你刚开始接触CircuitPython,可能会被一个看似简单的问题绊住:我写好的代码,为什么一运行就报错说找不到某个模块?这个问题背后,其实牵涉到CircuitPython生态中一个极其重要但文档往往语焉不…...

收藏!小白程序员必看:如何成为AI大模型应用开发工程师,解锁高薪新机遇?

AI大模型应用开发工程师是连接技术与产业的关键角色,负责将复杂AI技术转化为实用工具。他们需分析业务需求、选择适配技术、开发对接应用,并进行测试优化与运维。这一职业因“技术业务”复合能力稀缺,薪资待遇优厚,是当前极具吸引…...

把 RAG 做成主流的公司,现在开始“做空”RAG 了

Pinecone 刚刚几乎等于亲口宣布:RAG 时代结束了。 作为向量数据库赛道的开创者,Pinecone 当年亲手把 RAG 定义成了大语言模型 grounding 的标准范式。过去几年里,大约 80 万开发者、9000 家付费客户,都在 Pinecone 的基础设施上学…...

收藏!小白程序员必看:大模型概念拆解,告别术语混乱,轻松入门!

本文通过餐厅比喻,详细解释了大模型AI中的核心概念:Model(大模型)、Prompt(提示词)、Tool(工具)、Agent(智能体)、Workflow(工作流)和…...

当前塑造 AI 未来的大问题

原文:towardsdatascience.com/the-big-questions-shaping-ai-today-5e7c1da38b41?sourcecollection_archive---------6-----------------------#2024-08-08 https://towardsdatascience.medium.com/?sourcepost_page---byline--5e7c1da38b41---------------------…...

实测Taotoken多模型聚合服务的响应延迟与稳定性表现

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 实测Taotoken多模型聚合服务的响应延迟与稳定性表现 在将大模型能力集成到实际应用时,开发者不仅关注模型的功能与成本…...

紧急预警!YouTube已启动Sora 2生成内容专项识别模型(v2.3.1),你的视频是否在灰度检测池?立即自查清单

更多请点击: https://intelliparadigm.com 第一章:紧急预警!YouTube已启动Sora 2生成内容专项识别模型(v2.3.1),你的视频是否在灰度检测池?立即自查清单 YouTube 已于 2024 年 6 月 18 日凌晨正…...

阿里云语音合成与教务内容:通知、导读、听力材料怎么配

阿里云语音合成与教务内容:通知、导读、听力材料怎么配在教务工作中,语音内容的需求无处不在:每日通知、课程导读、听力练习……传统人工录音耗时耗力,而阿里云语音合成技术能以低成本输出稳定、自然的语音。本文将聚焦三种典型场…...

在技术评审会上,如何让非技术背景的领导听懂你的价值?

一、理解思维错位的根源非技术背景领导与技术人员的核心关注点存在本质差异。领导关心的是业务结果:项目能否按时上线、用户体验会不会受影响、能否降低成本或规避风险。而测试工程师的天然思维是描述技术动作:执行了多少条用例、发现了多少个缺陷、优化…...

在线 TTS 采购思维:不是买工具,是买可重复流程

🎯 在线 TTS 采购思维:不是买工具,是买可重复流程 在语音合成市场日益成熟的今天,越来越多的团队开始引入在线 TTS。但一个普遍误区是:大家只关注单次合成效果,却忽略了流程的可重复性。 真正聪明的采购&…...

【ElevenLabs旁白语音工业级交付标准】:帧精度±3ms同步、响度LUFS≤-23、动态范围≥14dB——你达标了吗?

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs纪录片旁白语音工业级交付标准全景定义 在纪录片制作工业化进程中,旁白语音已从“可用即可”跃迁至“毫秒级对齐、语义级情感建模、多语种零偏差复现”的交付新范式。ElevenLabs …...

为OpenClaw智能体工作流配置Taotoken作为统一模型供应商的详细步骤

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为OpenClaw智能体工作流配置Taotoken作为统一模型供应商的详细步骤 OpenClaw是一个用于构建和编排AI智能体的开源框架。如果你正在…...

COCO数据集实例解析:从JSON结构到YOLO格式的实战转换

1. COCO数据集JSON结构深度解析 第一次打开COCO数据集的JSON文件时,我完全被里面复杂的嵌套结构搞懵了。这个文件就像俄罗斯套娃,一层套着一层。经过多次实战踩坑,终于摸清了它的门道。COCO的标注文件主要包含五个关键部分,每个部…...

有限元分析前传:不懂‘最小势能原理’和‘自然边界条件’?从变分法开始说清楚

有限元分析前传:从变分法到最小势能原理的工程实践指南 在ANSYS或Abaqus中点击"求解"按钮时,软件究竟在背后执行什么数学魔法?许多工程师能熟练操作CAE界面,却对弹窗中"势能最小化计算中"的提示感到困惑。当我…...

不止是多旋翼:用CopterSim玩转固定翼仿真,从模型替换到3D场景飞行全记录

从多旋翼到固定翼:解锁CopterSim的跨机型仿真潜能 当大多数人提起CopterSim时,第一反应往往是多旋翼无人机的仿真利器。但鲜为人知的是,这款工具蕴藏着更广阔的仿真可能性——通过巧妙的模型替换与参数调整,它能够完美模拟固定翼飞…...

三步解锁Chrome浏览器中的Markdown阅读新体验

三步解锁Chrome浏览器中的Markdown阅读新体验 【免费下载链接】markdownReader markdownReader is a extention for chrome, used for reading markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownReader 在Chrome浏览器中直接打开Markdown文件时&…...