news 2026/8/7 12:48:28

【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/8/2 18:34:15

Coolapk-UWP桌面端深度体验:为技术爱好者打造的社区浏览新范式

Coolapk-UWP桌面端深度体验&#xff1a;为技术爱好者打造的社区浏览新范式 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 在数字内容消费日益多元化的今天&#xff0c;技术爱好者对社区平…

作者头像 李华
网站建设 2026/8/4 5:15:56

StructBERT零样本分类源码解读:模型架构设计

StructBERT零样本分类源码解读&#xff1a;模型架构设计 1. 引言&#xff1a;AI 万能分类器的诞生背景 在自然语言处理&#xff08;NLP&#xff09;的实际应用中&#xff0c;文本分类是企业智能化转型的核心能力之一。传统分类模型依赖大量标注数据进行训练&#xff0c;开发周…

作者头像 李华
网站建设 2026/8/2 10:16:06

B站视频下载技术深度解析:bilibili-downloader架构设计与实践指南

B站视频下载技术深度解析&#xff1a;bilibili-downloader架构设计与实践指南 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 问题诊断…

作者头像 李华
网站建设 2026/7/31 6:31:46

PCBA焊接工艺全流程解析:超详细版指南

PCBA焊接工艺全流程实战解析&#xff1a;从入门到精通的工程指南 在电子制造的世界里&#xff0c;一块电路板能否“活”起来&#xff0c;关键就在那一道道看不见的焊点上。你有没有遇到过这样的情况&#xff1a;产品功能设计得再完美&#xff0c;却因为一个虚焊导致整机失效&am…

作者头像 李华
网站建设 2026/7/31 6:31:44

新手教程:继电器模块电路图识图基础要点

从零看懂继电器模块电路图&#xff1a;电子新手也能掌握的实战识图指南你有没有过这样的经历&#xff1f;手握一块继电器模块&#xff0c;引脚密布、灯闪闪烁&#xff0c;却不知道哪根线该接MCU&#xff0c;哪根连电源&#xff0c;更别提看懂背后的电路图了。明明只是想用Ardui…

作者头像 李华
网站建设 2026/7/31 6:31:46

YimMenu:GTA V安全使用与游戏增强全方位指南

YimMenu&#xff1a;GTA V安全使用与游戏增强全方位指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …

作者头像 李华