新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++默认成员函数:构造与析构函数

发布时间:2026/10/1 2:43:23来源:尧图网络
C++默认成员函数:构造与析构函数
目录1.为什么要有默认成员函数2.构造函数2.析构函数1.为什么要有默认成员函数1.1默认成员函数是什么当没有显式地写出某些成员函数时C 编译器可能会自动为这个类生成默认成员函数。默认成员函数负责对象的创建、销毁、拷贝、移动。1.2意义C 要有默认成员函数主要原因是让类在大多数情况下不写任何特殊函数也能像内置类型一样被创建、复制、销毁和使用同时把“需要自定义”的情况留给程序员自己处理。2.构造函数构造函数的而主要任务对象实例化时初始化对象。构造函数就是要替代之前写过的类似 Init 函数 的功能特征函数名和类名完全相同没有返回值类型连void都不写创建对象时自动调用可以重载可以有多个构造函数参数不同如果没有显式定义的构造函数编译器就会自动生成一个无参的默认构造函数无参的构造函数、全缺省的构造函数、编译器自己生成的构造函数都是默认构造函数通常用class Date { public: // 1.无参构造函数 /*Date() { _year 1; _month 1; _day 1; }*/ // 2.全缺省的构造函数全缺省的构造函数和无参构造函数不能同时存在 Date(int year 1, int month 1, int day 1) { _year year; _month month; _day day; } void Print() { cout _year / _month / _day endl; } private: int _year; int _month; int _day; }; int main() { Date d1; // 调用默认构造函数能自动初始化 Date d2(2026, 3, 2); // 调用带参的构造函数能自动初始化 // 注意创建默认构造对象应写 Date d3;不加括号 // 如果写成 Date d3();编译器会把它当成函数声明 Date d3(); // 这里 d3 是一个函数声明不是 Date 对象 d1.Print(); d2.Print(); // d3.Print(); // 错误d3 是函数声明不是对象不能调用成员函数 return 0; }构造函数的具体使用编译器默认生成的构造函数对内置类型 (int、double、指针等) 成员变量的初始化要看编译器,通常不初始化对自定义类型成员变量要求调用这个成员变量的默认构造函数初始化内置类型成员变量class Date { public: // 不写任何构造函数编译器默认生成一个 int _year; int _month; int _day; }; int main() { Date d; // 调用默认构造函数分配内存 // 危险操作读取未初始化的内存未定义行为 cout d._year endl; // 极大概率输出随机垃圾值偶尔是0看编译器状态 return 0; }自定义类型成员变量//如果类A里有另一个类B的对象作为成员当创建A时编译器必须保证B被正确初始化 class Inner { public: Inner() { _val 10; cout Inner的默认构造函数被调用了 endl; } int _val; }; class Outer { public: // //不写任何构造函数编译器默认生成一个 int _a; // 内置类型成员变量 Inner _in; // 自定义类型成员变量 _in是类Inner的对象会调用它的默认构造函数 }; int main() { Outer o; //cout o._a endl; // 未初始化 cout o._in._val endl; // 10 return 0; }对自定义类型成员变量要求调用这个成员变量的默认构造函数初始化如果这个成员变量没有默认构造函数就会报错。2.析构函数析构函数的而主要任务用来清理对象占用的资源。注意析构函数销毁的 不是 对象本身的内存而是对象 在生命周期内所获取的“资源”比如动态内存。特征函数名是 ~ 类名。没有参数没有返回值类型不加 void不能重载一个类只能有一个析构函数。如果没有显式定义系统会自动生成默认的析构函数对象 生命周期结束、离开作用域、程序结束...时自动调用后定义的对象先析构构造函数的具体使用不写析构函数编译器会生成一个默认析构函数默认析构函数的行为成员类型默认析构函数行为自定义类型成员自动调用该成员自己的析构函数内置类型成员int、double、指针等什么都不做#include iostream using namespace std; class Inner { public: Inner() { _data (int*)malloc(100 * sizeof(int)); cout Inner 申请了资源 endl; } ~Inner() { free(_data); cout Inner 释放了资源 endl; } private: int* _data; }; class Outer { private: Inner _inner; // 成员对象 int _num; // 内置类型成员 }; int main() { Outer o; // 程序结束时o 销毁 // 1. 调用 Outer 的默认析构 // 2. 自动调用 _inner 的析构函数 - 打印 Inner 释放了资源 // 3. _num 是内置类型什么都不做 return 0; }总结有资源申请时一定要自己写析构否则会造成内存泄漏要点构造函数析构函数名字类名~类名参数可有可重载无不可重载返回值无无调用时机对象创建对象销毁默认生成有条件生成不写任何构造时总是生成不写时默认行为成员对象调用其默认构造调用其析构默认行为内置类型不初始化垃圾值不清理可能导致内存泄漏
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

快速排序全攻略:原理、优化与工程实践 2026/10/1 3:30:04

快速排序全攻略:原理、优化与工程实践

如果只能让我给新人推荐一个必须吃透的排序算法,我会毫不犹豫地选快速排序。它不仅是面试题里的常客,更是分治思想、递归、随机化乃至工程折中的一次集中体现。不管是C语言、Java还是JavaScript,也无论是写一个纯前端表格的点击表头排序&…

阅读更多 →
SSM+Maven+MySQL企业人事管理系统实战:从建表到部署完整指南 2026/10/1 3:30:04

SSM+Maven+MySQL企业人事管理系统实战:从建表到部署完整指南

做JavaWeb课设或者毕设的同学,SSMMavenMySQL这套组合应该是接触频率最高的搭配了。基于javaweb和mysql的ssmmaven企业人事管理系统,我用SSM框架完整实现了一个可运行、可部署、可扩展的企业人事管理系统,覆盖员工信息管理、部门维护、考勤记录…

阅读更多 →
Spring Boot旅游系统实战:从数据库设计到远程调试部署全流程 2026/10/1 3:30:04

Spring Boot旅游系统实战:从数据库设计到远程调试部署全流程

最近不少同学在后台问我:SpringBoot毕设到底怎么上手?尤其是像“绍兴旅游系统”这种听上去模块很多、功能很杂的项目,很多同学第一眼看到源码就懵了,不知道从哪开始跑,也不知道部署之后出了问题怎么排查。今天我就用这…

阅读更多 →
ADB实战手册:从基础连接到高级调试的完整指南 2026/10/1 3:30:04

ADB实战手册:从基础连接到高级调试的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
手机号验证码登录全流程设计与防刷实战 2026/10/1 3:30:04

手机号验证码登录全流程设计与防刷实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Redis缓存店铺查询:读多写少场景下的设计与实践 2026/10/1 3:29:51

Redis缓存店铺查询:读多写少场景下的设计与实践

店铺项目做到第二天,终于轮到性能优化里最经典也最实用的一环:把店铺查询信息加进Redis缓存。“黑马店铺”这个项目本身就是读多写少的典型——用户进首页看店铺列表、点店铺详情、搜索店铺,几乎全是查询操作。如果每次查询都直接打到MySQL&a…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉