news 2026/4/21 22:58:37

【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/20 12:53:15

【c++】AVL树模拟实现

AVL树是最先被发明出来的自平衡二叉查找树&#xff0c;在1962由前苏联科学家G. M. Adelson-Velsky和E. M. Landis在论文中发表。AVL树中引入了平衡因子&#xff0c;每一个节点都有一个平衡因子&#xff08;一般是右子树高度 - 左子树高度&#xff09;&#xff1b;AVL树要求左右…

作者头像 李华
网站建设 2026/4/21 18:34:12

ResNet18快速部署:5步实现物体识别API

ResNet18快速部署&#xff1a;5步实现物体识别API 1. 背景与应用场景 在计算机视觉领域&#xff0c;通用物体识别是基础且关键的能力。无论是智能相册分类、内容审核、AR增强现实&#xff0c;还是工业质检的初步筛选&#xff0c;都需要一个稳定、高效、可本地运行的图像分类模…

作者头像 李华
网站建设 2026/4/21 10:49:01

如何验证交叉编译工具链正确性?超详细版

如何验证交叉编译工具链的正确性&#xff1f;从入门到实战的完整指南你有没有遇到过这样的情况&#xff1a;在 x86 的开发机上顺利编译出一个程序&#xff0c;兴冲冲地拷贝到 ARM 开发板上运行&#xff0c;结果系统报错Exec format error&#xff1f;或者程序能启动&#xff0c…

作者头像 李华
网站建设 2026/4/18 8:22:06

3步解决Navicat试用期限制问题

3步解决Navicat试用期限制问题 【免费下载链接】navicat_reset_mac navicat16 mac版无限重置试用期脚本 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 还在为Navicat Premium的14天试用期到期而烦恼吗&#xff1f;这款专业的数据库管理工具功能强大&…

作者头像 李华
网站建设 2026/4/19 9:09:25

B站视频下载完整解析:高效离线收藏实战指南

B站视频下载完整解析&#xff1a;高效离线收藏实战指南 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为B站精彩视频无法永久保存…

作者头像 李华