news 2026/4/20 0:51:18

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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; }

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 15:34:17

3分钟极速搞定Joy-Con手柄连接电脑:新手零失败配置秘籍

3分钟极速搞定Joy-Con手柄连接电脑&#xff1a;新手零失败配置秘籍 【免费下载链接】JoyCon-Driver A vJoy feeder for the Nintendo Switch JoyCons and Pro Controller 项目地址: https://gitcode.com/gh_mirrors/jo/JoyCon-Driver 还在为Joy-Con手柄无法在电脑上使用…

作者头像 李华
网站建设 2026/4/18 5:35:36

AI万能分类器性能测试:与传统机器学习模型对比

AI万能分类器性能测试&#xff1a;与传统机器学习模型对比 1. 引言&#xff1a;为何需要AI万能分类器&#xff1f; 在当今信息爆炸的时代&#xff0c;文本数据的自动化处理已成为企业智能化运营的核心需求。无论是客服工单、用户反馈、新闻资讯还是社交媒体内容&#xff0c;都…

作者头像 李华
网站建设 2026/4/16 11:11:52

终极指南:3步搞定Joy-Con手柄连接Windows电脑

终极指南&#xff1a;3步搞定Joy-Con手柄连接Windows电脑 【免费下载链接】JoyCon-Driver A vJoy feeder for the Nintendo Switch JoyCons and Pro Controller 项目地址: https://gitcode.com/gh_mirrors/jo/JoyCon-Driver 还在为Joy-Con手柄无法在PC上正常使用而苦恼吗…

作者头像 李华
网站建设 2026/4/18 6:55:39

AI万能分类器技术深度解析:StructBERT架构优势

AI万能分类器技术深度解析&#xff1a;StructBERT架构优势 1. 技术背景与问题提出 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本分类是构建智能系统的基础能力之一。传统分类模型依赖大量标注数据进行监督训练&#xff0c;开发周期长、成本高&#xff0c;…

作者头像 李华
网站建设 2026/4/18 16:18:47

如何看懂PCB板电路图核心要点:一文说清

如何真正看懂PCB电路图&#xff1f;一位老工程师的实战心法你有没有过这样的经历&#xff1a;拿到一块陌生的PCB板&#xff0c;打开对应的电路图&#xff0c;满屏密密麻麻的符号和走线&#xff0c;眼睛都快看花了&#xff0c;却不知道从哪下手&#xff1f;明明每个元件都认识&a…

作者头像 李华
网站建设 2026/4/18 9:14:18

ASPEED平台下OpenBMC日志系统配置完整示例

在ASPEED平台上构建可靠的OpenBMC日志系统&#xff1a;从配置到实战你有没有遇到过这样的场景&#xff1f;服务器突然宕机&#xff0c;现场却没有任何线索。远程登录BMC一看&#xff0c;journalctl一刷&#xff0c;空空如也——重启后日志全没了。或者更糟&#xff0c;Flash被日…

作者头像 李华