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

【c++】类和对象 (中)

构造函数的特点:

1. 函数名与类名相同。

2. 无返回值。(返回值啥都不需要给,也不需要写void,不要纠结,C++规定如此)

3. 对象实例化时系统会自动调用对应的构造函数。

4. 构造函数可以重载。

5. 如果类中没有显式定义构造函数,则C++编译器会自动生成⼀个无参的默认构造函数,⼀旦用户显式定义编译器将不再生成。

6. 无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函 数。但是这三个函数有且只有⼀个存在,不能同时存在。无参构造函数和全缺省构造函数虽然构成 函数重载,但是调用时会存在歧义。要注意很多同学会认为默认构造函数是编译器默认生成那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造,总结⼀下就是不传实参就可以调用的构造就叫默认构造。

7. 我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始 化是不确定的,看编译器。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始 化。如果这个成员变量,没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要用初始化列表才能解决,初始化列表,我们下个章节再细细讲解。

代码语言:javascript

AI代码解释

#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; typedef int STDataType; class Stack { public: Stack(int n = 4) { _a = (STDataType*)malloc(sizeof(STDataType) * n); if (nullptr == _a) { perror("malloc申请空间失败"); return; } _capacity = n; _top = 0; } // ... private: STDataType* _a; size_t _capacity; size_t _top; }; // 两个Stack实现队列 class MyQueue { public: //编译器默认生成MyQueue的构造函数调⽤了Stack的构造,完成了两个成员的初始化 private: Stack pushst; Stack popst; }; int main() { MyQueue mq; return 0; }

对自定义的成员变量会调用这个成员变量的默认构造。

如果这个成员变量没有默认构造就会报错

同时要注意对内置类型的处理c++标准没有规定,不同编译器处理的不同,为了规避错误,我们要自己手动处理内置类型。

接下来我们来手动的实现几个构造函数:

无参的构造函数

代码语言:javascript

AI代码解释

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; //创建一个类Date class Date { public: // 1.无参构造函数 Date() { _year = 1; _month = 1; _day = 1; } void print() { cout << _year << "/" << _month << "/" << _day << endl; } private: int _year; int _month; int _day; }; int main() { Date d1; d1.print(); return 0; }

在监视窗口可以看到在实例化对象之后,构造函数已经被自动调用了。

下面的是用c语言实现的链表的初始化,相比之下我们可以发现c++中的构造函数并不需要显式的调用

带参构造函数

代码语言:javascript

AI代码解释

#include <iostream> using namespace std; //创建一个类Date class Date { public: // 1.无参构造函数 Date() { _year = 1; _month = 1; _day = 1; } //2.带参的构造函数 Date(int year, int month, int day) { _year = year; _month = month; _day = day; } void print() { cout << _year << "/" << _month << "/" << _day << endl; } private: int _year; int _month; int _day; }; int main() { /*Date d1; d1.print();*/ Date d2(2024, 8, 8); d2.print(); return 0; }

相比于无参的构造函数,带参的构造函数能够在初始化的时候手动设置初始化的数据,具有更高的自由度。

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

相关文章:

  • 【c++】 模板初阶
  • StructBERT零样本分类器优化指南:提升实时分类性能
  • Windows 10系统优化终极指南:深度解析Win10BloatRemover工具
  • 暗黑2单机终极秘籍:5招解锁隐藏玩法
  • 【c++】AVL树模拟实现
  • PvZ Toolkit植物大战僵尸修改器:轻松打造你的专属游戏体验
  • 蓝奏云直链解析工具:简化文件下载的智能解决方案
  • 数字电路实验驱动继电器控制:操作指南
  • C++ Vector 核心问题精讲
  • 专业级手机摄像头集成方案:DroidCam OBS Plugin深度解析
  • StructBERT零样本分类教程:领域适应方法
  • FlightSpy智能机票追踪系统:数据驱动的出行决策革命
  • emwin界面缩放适配方案探讨
  • QMC音频解密终极指南:三分钟解锁加密音乐文件
  • GPU内存诊断专家:MemTestCL完全使用指南与深度解析
  • PvZ Toolkit实战手册:解锁植物大战僵尸无限可能
  • Nrfr免Root工具:全球漫游网络优化的终极解决方案
  • 移动端PDF预览完整解决方案:告别兼容性困扰
  • yuzu模拟器输入精度调校指南:从基础校准到专业级优化
  • Zotero-reference插件复制功能失效的终极解决方案指南
  • 脉冲信号处理机制:数字电路实验从零实现
  • 如何高效采集抖音评论数据:零基础实战指南
  • 智能机票监控系统:让科技为你的旅行省钱
  • Linux下screen指令实战案例:后台任务管理详解
  • 零样本分类最佳实践:如何利用AI万能分类器优化工单处理
  • Umi-OCR部署实战:从下载到高效使用的完整流程
  • 终极法线贴图生成器:零基础打造专业级3D纹理效果
  • CircuitJS1 Desktop Mod:零基础也能玩转的电路模拟神器!
  • 英雄联盟皮肤修改神器:零基础打造专属游戏外观
  • 2025年必备!3分钟学会AcFun视频下载的终极方法 [特殊字符]