C++初阶学习第四弹——类与对象(中)

  

目录

一.  类的默认成员函数

 二.六种默认成员函数

1、构造函数

1.1 构造函数的作用

1.2 特性

 1.3 默认构造函数

2、析构函数

2.1 析构函数的作用

2.2 析构函数的用法

3、拷贝构造函数

3.1 拷贝构造函数的作用

3.2 特征

3.3 默认拷贝构造函数

三.总结

类与对象(上):C++初阶学习第三弹——类与对象(上)-CSDN博客

一.  类的默认成员函数

如果一个类中什么成员都没有,简称为空类。而默认成员函数就是不用写,编译器会自动生成的函数。任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。

 二.六种默认成员函数

1、构造函数

1.1 构造函数的作用
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
int main()
{Date a1;a1.Init(2023, 7, 26);Date a2;a2.Init(2024, 7,29 );return 0;
}

对于Date类,可以通过 Init 公有方法给对象设置日期,但如果每次创建对象时都调用该方法设置 信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢? 

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证 每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。

1.2 特性

1. 函数名与类名相同。

2. 无返回值。

3. 对象实例化时编译器自动调用对应的构造函数。

4. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。

5.如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,

 构造函数的形式如下:

  class Date{public:// 1.无参构造函数Date(){}// 2.带参构造函数Date(int year, int month, int day){_year = year;
比特就业课
5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦
用户显式定义编译器将不再生成。_month = month;_day = day;}private:int _year;int _month;int _day;};void TestDate(){Date d1; // 调用无参构造函数Date d2(2015, 1, 1); // 调用带参的构造函数// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明// 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象// warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)Date d3();}

 1.3 默认构造函数

构造函数在类中实际上是可以自动生成的,当我们不去写默认构造函数时,它就会在类中自动生成,但我们需要注意的是,默认生成的构造函数是无参的,且它会初始化一个随机值

class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.Print();return 0;
}

如下图:

2、析构函数

2.1 析构函数的作用

析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由 编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

2.2 析构函数的用法

1. 析构函数名是在类名前加上字符 ~。:~类名()

2. 无参数无返回值类型。

3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构 函数不能重载

4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

 如下:

class Stack
{
public:Stack(int capacity=4)   //构造函数{_capacity = capacity;_arr = (int*)malloc(sizeof(int) * _capacity);_size = 0;}~Stack()              //析构函数{free(_arr);_arr = nullptr;_capacity = 0;_size = 0;}
private:int* _arr;int _capacity;int _size;
};
int main()
{Stack s();return 0;
}

对于上面那种需要申请资源的类类型,我们可以把析构函数写出来,对于并没有申请资源的类类型,我们可以不写析构函数,让编译器默认生成

3、拷贝构造函数

3.1 拷贝构造函数的作用

拷贝构造函数的作用就是将一个已经构造好的函数拷贝给另一个函数。

3.2 特征

拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错, 因为会引发无穷递归调用。

拷贝构造函数只有单个形参 ,该形参是对本 类类型对象的引用 ( 一般常用 const 修饰 ) ,在用 已存

在的类类型对象创建新对象时由编译器自动调用 。

class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024, 7, 27);Date d2(d1);return 0;
}
3.3 默认拷贝构造函数

若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按 字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

注意:类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请 时,则拷贝构造函数是一定要写的,否则就是浅拷贝。

 

class Date
{
public: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(2024, 7, 27);Date d2(d1);d2.Print();return 0;
}

 

三.总结

希望给大家带来一定的帮助,下节我会接着讲解关于类和对象—中阶的内容

感谢大佬们的支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion WebUI本地环境搭建

一、项目代码下载 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、环境配置 conda create --n stafu python3.10.6 实际上跟自己创建的环境没有关系&#xff0c;项目启动会自动复制这个环境&#xff0c;之后项目根据这个基础环境构建 也可以在自己…

在一个事物方法中开启新事物,完成对数据库的修改

在Java中&#xff0c;使用Transactional注解来管理事务非常常见。但是&#xff0c;在一个已经标记为Transactional的方法内部调用另一个也标记了Transactional的方法时&#xff0c;如果不正确处理&#xff0c;可能会导致一些意料之外的行为。这是因为默认情况下&#xff0c;Spr…

【VUE】封装一个追随鼠标的漂浮组件框架

红色箭头代表鼠标位置&#xff0c;蓝色区域跟随鼠标出现&#xff0c;鼠标进行其他操作的时候&#xff0c;蓝色区域隐藏。 vue全码 <template><divmousemove"updatePosition"mouseleave"hideDiv"class"container":style"{ positi…

《Milvus Cloud向量数据库指南》——BGE-M3:多功能、多语言、多粒度的文本表示学习模型

引言 在自然语言处理(NLP)领域,随着大数据时代的到来,对文本信息的精准处理与高效检索成为了研究热点。BERT(Bidirectional Encoder Representations from Transformers)作为近年来NLP领域的里程碑式模型,以其强大的上下文理解能力在多项任务中取得了显著成效。然而,面…

《C语言实现各种排序算法》

文章目录 一、排序1、排序的各种方式分类 二、插入排序1、直接插入排序2、希尔排序3、希尔排序时间复杂度分析 三、选择排序1、直接选择排序2、堆排序 四、交换排序1、冒泡排序2、快速排序 一、排序 在生活中各种场景中都会有排序的身影存在&#xff0c;在网购时会有价格排序&a…

Apache Nifi挂接MQTT与Kafka实践

目录 1. 说明&#xff1a; 2. 方案设计&#xff1a; 2.1 资源配置&#xff1a; 2.2 交互Topics: 3. 实现步骤 3.1 Nifi 桌面 3.2 MqttToKafka 3.2.1 配置 3.2.2 测试 3.2.3 结果 3.3 KafkaToMqtt 3.3.1 配置 3.3.1 测试 3.3.1 结果 ​编辑 4. 总结&#xff…

Mysql的RedoLog、BingLog、UndoLog

UndoLog undo log 是一种用于撤销回退的日志。在事务没提交之前&#xff0c;MySQL 会先记录更新前的数据到 undo log 日志文件里面&#xff0c;当事务回滚时&#xff0c;可以利用 undo log 来进行回滚。 每当 InnoDB 引擎对一条记录进行操作&#xff08;修改、删除、新增&#…

vue3 命令运行窗口暴露网络地址,以及修改端口号

一般情况下这里的地址是隐藏的 这里加上 --host 可以暴露网络地址&#xff0c;再加上--port --8080 就可以将端口号修改为8080&#xff08;修改后边的数字就可以修改为你想要的端口号&#xff09;

物联网时代下的5G融合定位,可以实现哪些功能?

5G具有高带宽、高频谱&#xff08;毫米波&#xff09;、多天线阵列等特性&#xff0c;通过提升无线定位算法的能力、室内数字系统建设、完善5G定位服务流程以及与其它定位技术和平台的结合&#xff0c;可提高5G定位精度。室内高精度定位服务为5G定位扩展到更多应用场景和领域构…

JVM:垃圾回收器演进

文章目录 一、演进二、Shenandoah三、ZGC 一、演进 二、Shenandoah Shenandoah是由Red Hat开发的一款低延迟的垃圾收集器&#xff0c;Shenandoah并发执行大部分GC工作&#xff0c;包括并发的整理&#xff0c;堆大小对STW的时间基本没有影响。 三、ZGC ZGC是一种可扩展的低延…

算法——滑动窗口(day8)

30.串联所有单词的子串 30. 串联所有单词的子串 - 力扣&#xff08;LeetCode&#xff09; 必看&#xff01;&#xff01;&#xff01;本题是我们上次写的438.异位词的进阶版&#xff0c;可参考本篇文章&#xff1a;算法——滑动窗口&#xff08;day7&#xff09;-CSDN博客来…

【SOLUTION】Spring Boot 集成 WebSocket

1. Maven 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>2. 注册ServerEndpointExporter、WebSocketConfigProperties WebSocketConfigProperties…

W30-python01-Selenium Web自动化基础--百度搜索案例-chrome浏览器为例

原理图 一、下载webdriver--chrome浏览器 根据本机浏览器的版本号下载对应的webdriver版本 http://chromedriver.storage.googleapis.com/index.html 二、安装selenium库 pip install selenium -i Simple Index 三、第一个Web自动化脚本 selenium实现Web自动化的基本步骤&…

【Qt 】JSON 数据格式详解

文章目录 1. JSON 有什么作用?2. JSON 的特点3. JSON 的两种数据格式3.1 JSON 数组3.2 JSON 对象 4. Qt 中如何使用 JSON 呢&#xff1f;4.1 QJsonObject4.2 QJsonArray4.3 QJsonValue4.4 QJsonDocument 5. 构建 JSON 字符串6. 解析 JSON 字符串 1. JSON 有什么作用? &#x…

1、hadoop环境搭建

1、环境配置 ip(/etc/sysconfig/network-scripts) # 网卡1 DEVICEeht0 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOstatic IPADDR192.168.59.11 GATEWAY192.168.59.1 NETMASK 255.255.255.0 # 网卡2 DEVICEeht0 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOdh…

算法通关:006_3二分查找:查找数组中<=num 最右边的值

文章目录 说明主要代码全部代码运行结果 说明 大于等于最右不考&#xff0c;意义不大。 直接看&#xff08;arr.length-1&#xff09; 位&#xff08;即数组最后一位&#xff09;&#xff0c;如果大于num&#xff0c;那就说明arr[arr.length-1]是大于等于最右的数字数组最后一…

Redux +Toolkit 工具包快速入门

您将学到什么 如何设置并使用 Redux Toolkit 和 React-Redux 先决条件 熟悉ES6 语法和功能了解 React 术语&#xff1a;JSX、State、Function Components 、 Props和Hooks理解Redux 术语和概念 1、基本使用 1.1、安装 Redux Toolkit 和 React- Redux 将 Redux Toolkit 和 Rea…

学习C语言第十四天(指针练习)

1.第一题C 2.第二题C 3.第三题 00345 short类型解引用一次访问两个字节 4.第四题 6&#xff0c;12 5.第五题C 6.第六题 下面代码结果是0x11223300 7.第七题 int main() {int a 0;int n 0;scanf("%d %d",&a,&n);int i 0;int k 0;int sum 0;for (i 0;…

sklearn聚类算法用于图片压缩与图片颜色直方图分类

上期文章:机器学习之SKlearn(scikit-learn)的K-means聚类算法 我们分享了sklearn的基本知识与基本的聚类算法,这里主要是机器学习的算法思想,前期文章我们也分享过人工智能的深度学习,二者有如何区别,可以先参考如下几个实例来看看机器学习是如何操作的 不同K值下的聚…

算法解决海量数据的 topK

目录 设计算法解决海量数据的 topK 问题如何统计不同电话号码的个数&#xff1f;题目描述解答思路与实现步骤注意点 如何在大量的数据中判断一个数是否存在&#xff1f;题目描述解决方案具体步骤优化与注意事项 如何从大量的 URL 中找出相同的 URL&#xff1f;题目描述解答思路…