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

C++ 类与对象(二)(1.构造析构函数)

目录

类的默认成员函数

构造析构函数

1.构造函数

2.拷贝构造函数

3.析构函数


类的默认成员函数

在书写构造类的时候,除了我们所写的成员函数之外,如果没有编写对应的默认函数,编译器会默认生成对应的6个默认函数,比较重要的前4个函数。

补充:在C++11以后多了2个默认函数,移动构造和移值构造

为什么要写默认成员函数?

原因:编译器的提供的默认成员函数,对于我们程序员来说可能不是想要的,不同情况编译器提供的默认成员函数不适配,需要进行修改。

构造析构函数

1.构造函数

在原先用C语言写Stack等数据结构中每次都需要Init函数,来进行初始化,在每次都有可能我们忘记进行初始化,导致系统报错的可能,所以在C++中构造函数就为了解决这个问题的,在每次实例化对象的时候都会进行调用构造函数进行初始化。

构造函数的特点及要求:

  1. 函数名与类名同名。
  2. 无返回值。(在C++ 中构造函数可以不用写void)
  3. 对象实例化后自动调用构造函数。
  4. 构造函数可以重载,遵循重载规则。
  5. 用户没有构造函数,编译器自动生成,如果有就不会生成,就用用户自己的构造函数。
  6. 无参构造或者、全缺省构造函、编译自动生成的构造函数,都叫构造函数。三个函数只能存在一个,不能同时出现。前两存在的时候会导致无参和缺省构造导致分歧。

日期类的构造函数(全缺省写法):

//Date.h #pragma once #include <iostream> #include <stdlib.h> #include <stdbool.h> #include <assert.h> using namespace std; class Date { public: Date(int year = 1, int month = 1, int day = 1); void Print(); private: int _year; int _month; int _day; };
//Date.cpp #define _CRT_SECURE_NO_WARNINGS #include "Data.h" Date::Date(int year, int month, int day) { _year = year; _month = month; _day = day; } void Date::Print() { cout << _year << "/" << _month << "/" << _day << endl; } int main() { Date adt(2026, 8, 8); adt.Print(); return 0; }

无参和带参写法:

Date() { _year = 1; _month = 1; _day = 1; } Date(int year, int month, int day) { _year = year; _month = month; _day = day; }

很明显的看到全缺省的优势就体现出来了,而却这种带参写法还是有问题,如果只写年份,不写其他的内容一样会导致报错。

2.拷贝构造函数

定义:如果已经有一个相同类的实例化对象,可以通过拷贝该对象实例化一个所以成员变量一致的对象,这就是拷贝构造函数,也就是是一个特殊的狗制造函数。

拷贝构造函数要求及其特点:

  • 拷贝构造函数是构造函数的重载。
  • 拷贝构造函数必须第一个类型是类类型的对象的引用,如果使用的是类类型,会导无限递归报错,拷贝构造函数也可以多个参数,但第一个一定是类类型的引用,后面必须有缺省参数。
  • C++规定了自定义类型对象进行时必须用拷贝构造,所以这里的自定义类型传参值和返回值都会调用拷贝构造完成。
  • 若没有拷贝构造函数编译器也会自动生成对于的拷贝构造函数。与我们所写的拷贝构造不同编译器默认拷贝构造是通过一个字节一个字节经行的拷贝。
  • 学习拷贝构造的原因:
  • 像Date 类这种内存偏简单的类,编译器默认的拷贝构造就够用,但是 Stack 栈这种需要申请空间等复杂的内容,编译器生成的默认拷贝构造就不能满足我们的需求,所以需要自定义拷贝构造,自己需要自己搞。
  • 为什么要拷贝构一定第一个是类类型的应用:
  • 传值会产生临时对象调用拷贝构造,传值引用返回,返回的是返回对象的别名(应用),没有产生拷贝。
Data::Data(const Data& data) { _year = data._year; _month = data._month; _day = data._day; } Date::Date(const Date* d) { _year = d->_year; _month = d->_month; _day = d->_day; }

3.析构函数

析构函数就是在实例化对象在生命周期末的时候会调用,通常析构函数会使用在空间销毁上,像Stack栈的空间释放就可以使用到析构函数,代替Destory函数的作用,防止在我们忘记对空间释放时自动调用,与构造函数的特点一致,除了只会在生命周期结束时会使用,也不需要 void 做返回值,与构造不同就是在原先类名之前加一个“ ~ ”

Date::~Date() { //... };
typedef int STDataType; class Stack { public: // 构造函数 Stack(int n = 4) { _a = (STDataType*)malloc(sizeof(STDataType) * n); if (nullptr == _a) { perror("malloc"); exit(1); } _capacity = n; _top = 0; } // 拷贝构造函数 Stack(Stack& s) { _a = (STDataType*)malloc(sizeof(STDataType) * s._capacity); if (nullptr == _a) { perror("malloc"); exit(1);; } memcpy(_a,s._a,sizeof(STDataType)*s._top); _capacity = s._capacity; _top = s.top; } // 析构函数 ~Stack() { cout << "~Stack()" << endl; free(_a); _a = nullptr; _top = _capacity = 0; } private: STDataType* _a; // 动态数组 size_t _capacity; // 容量 size_t _top; // 栈顶下标,0代表空栈 };

析构函数调用顺序

在初始化多个实例化对象析构函数的调用也是有顺序的,析构函数调用顺序类似栈,会先调用最后实例化对象。

http://www.jsqmd.com/news/1407396/

相关文章:

  • 硬件RAID配置全解析:从原理到实战,构建高可用存储方案
  • 我每天都在用的 7 个 Claude Code 隐藏技巧
  • Java HTTPS证书验证绕过:安全实现HTTP/HTTPS兼容客户端
  • Callback参数安全漏洞深度解析:从JSONP机制到XSS攻击实战
  • Steve Brunton | Probability Bootcamp | 笔记 | 第三部分:高级概率 | Lecture 33 | Markov 不等式:一阶概率估计
  • 基于状态机的异步任务管理:解决图片生成任务失踪问题
  • 从“烫手山芋”到“香饽饽”:流拍资产盘活方法论
  • LLM智能体长期记忆架构:从语义片段整合到工程实践
  • 收费透明无隐形消费,绍兴学历提升选绍兴依米学历 - 浙江教育测评
  • 2026 台州靠谱装修/装饰/整装公司推荐全分类推荐|全国连锁红杉树为首选红杉树装修(行情参考+避坑指南+FAQ问答) - 星际AI
  • PyQt6 QCommandLineParser 类详解:命令行参数解析实战指南
  • 低轨卫星相控阵天线对星跟踪无需感知多普勒频偏_知乎发布20260809172917
  • 编程训练: 大学计算机 实验4 爬虫、人工智能基础
  • AI Agent Skill实现播客到小红书图文自动创作:工作流拆解与开源实践
  • Linux PipeWire深度解析之pw_properties_serialize_dict调用流程与实战(六十六)
  • 智能体环路工程实战:从理论到生产的Agent核心循环构建
  • 政企专网通信项目避坑指南:从选型、资质到后期运维
  • 在宜昌开公司十年,我们最懂老板们财税背后的不容易 - 二格
  • AI Agent权限管理:如何让执行身份与权限状态进入模型上下文
  • Git Push与Pull核心原理:从本地仓库到远程协作的完整指南
  • Excalidraw本地化部署实战:从Docker到生产环境的私有白板搭建
  • 80-版本列表分页与历史治理:为什么版本越多越要重视列表管理
  • 编程练习: 程序设计基础(python)实验一顺序结构程序设计
  • Failed to take /etc/passwd lock: Invalid argument解决方案
  • Hall 定理学习笔记 P10208 [JOI 2024 Final] 礼物交换 解题报告
  • 2024显示器接口终极指南:HDMI、DP、USB-C如何选?
  • DigitalOcean上LLM应用提示词缓存实战:成本降低40%,延迟优化至毫秒级
  • 湖北嘉柏财税服务有限公司收费标准:代账价格与服务明细全公开 - 二格
  • Axios网络错误ERR_CONNECTION_REFUSED:从TCP原理到实战排查指南
  • 企业数智化系统导入方法论:四阶十二步法