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

news2024/11/24 10:45:43

  

目录

一.  类的默认成员函数

 二.六种默认成员函数

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.coloradmin.cn/o/1953304.html

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

相关文章

LwIP入门实战 — 1 计算机网络简述

目录 1 计算机网络类别 2 常用网络协议与协议栈 2.1 常用网络协议 2.2 常用TCP/IP协议栈 3 网络协议的分层模型 4 协议层报文间的封装与拆封 5 WAN接口和LAN接口 1 计算机网络类别 广域网WAN(Wide Area Network)&#xff1a;广域网的作用范围通常为几十到几千公里&…

浅析JWT原理及牛客出现过的相关面试题

原文链接&#xff1a;https://kixuan.github.io/posts/f568/ 对jwt总是一知半解&#xff0c;而且项目打算写个关于JWT登录的点&#xff0c;所以总结关于JWT的知识及网上面试考察过的点 参考资料&#xff1a; Cookie、Session、Token、JWT_通俗地讲就是验证当前用户的身份,证明-…

记录|使用HslCommunication库进行写入Real数据的坑

项目场景&#xff1a; 现在已经通过HslCommunication连接上了PLC&#xff0c;需要对DB1.DBD10的位置处进行数据写入。 问题描述 但是进行将12.2写入指定位置DB1.DBD10时&#xff0c;发现无法从博图中实时检测到数据的写入。 下面是我当时错误的数据写入方法&#xff1a;【主…

Maven实战(一)- Maven安装与配置

Maven实战&#xff08;一&#xff09;- Maven安装与配置 文章目录 Maven实战&#xff08;一&#xff09;- Maven安装与配置1.下载安装包2.配置环境变量。3.安装目录分析4.设置HTTP代理5.镜像 前言&#xff1a; ​ 最近博主看完了《Maven实战》&#xff08;许晓斌著&#xff09;…

iOS collectionView 滑动出现空白

iOS collectionView 滑动出现空白 一个很常见的 banner 轮播&#xff0c;滑动的时候&#xff0c;有时候会出现空白&#xff0c;检查了下&#xff0c;发现代码没什么问题&#xff0c;上网查了也没啥结果&#xff0c;最后的解决方法是自定义layout解决 interface TMLoopViewLayo…

从0到1,AI我来了- (3)AI图片识别的理论知识-I

从上篇文章&#xff0c;我们分析通过Pytorch 封装的各种方法&#xff0c;解读了一遍图片识别训练到测试的流程。 这篇我们从理论上&#xff0c;理解下&#xff0c;图片是如何被识别的&#xff1f; 核心需要理解的内容有&#xff1f; 一张图片&#xff0c;如何被计算机读懂&a…

探索 Python 异步编程的利器:gevent 库

探索 Python 异步编程的利器&#xff1a;gevent 库 第一部分&#xff1a;背景介绍 在现代的软件开发中&#xff0c;异步编程模式因其在处理 I/O 密集型任务时的高效率而越来越受到重视。Python&#xff0c;作为一种动态、解释型的高级编程语言&#xff0c;其原生的异步编程支持…

如何判断IP是否属于网段10.134.208.0/20

首先想要判断IP是否属于网段&#xff0c;我们首先需要了解IP地址的组成结构&#xff1a; 网络IP地址的划分主要包括网络部分&#xff08;网络地址&#xff09;和主机部分&#xff0c;以及一个特殊的地址——广播地址。以下是详细的划分说明&#xff1a; 一、IP地址的组成 每…

中国式浪漫的源头之一:《楚辞》

文章目录 引言亦余心之所善兮,虽九死其犹未悔。惟草木之零落兮,恐美人之迟暮。沧浪之水清兮,可以濯吾缨。悲莫悲兮生别离,乐莫乐兮新相知。苟余心之端直兮,虽僻远其何伤。孰无施而有报兮,孰不实而有获?尺有所短,寸有所长。引言 楚辞中表里俱佳的文字,很有启发性。楚辞…

【学一点儿前端】本地或jenkins打包报错:getaddrinfo ENOTFOUND registry.nlark.com.

问题 今天jenkins打包一个项目&#xff0c;发现报错了 error An unexpected error occurred: "https://registry.nlark.com/xxxxxxxxxx.tgz: getaddrinfo ENOTFOUND registry.nlark.com". 先写解决方案 把yarn.lock文件里面的registry.nlark.com替换为registry.npmmi…

linux驱动--中断

中断号和中断的申请 中断号的添加-----定义设备节点&#xff0c;描述当前设备 通过设备树文件获取 /dts/xxxx.dts文件中进行设备的设置 在dts设备树文件中进行设备的定义&#xff0c;包括继承的设备&#xff0c;中断号的设置 需要对我们的dts设备树文件进行编译&#xff0…

Flink Doirs Connector 常见问题:Doris目前不支持流读

常见问题 Doris Source 在数据读取完成后&#xff0c;流为什么就结束了&#xff1f; 目前 Doris Source 是有界流&#xff0c;不支持 CDC 方式读取。 问题&#xff1a;对于 Flink Doris DataStream&#xff0c;Flink 想要在 流式读取 Doirs / 实时读 Doris&#xff0c;目前读…

网页的相关概念

什么是网页 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML 等制作的用于展示特定内容相关的网页集合。 网页是网站中的一页&#xff0c;通常是 HTML 格式的文件&#xff0c;需通过浏览器来阅读。 网页是构成网站的基本元素&#xff0c;通常由图片、链接、文字、声…

MySQL表的增删查改(3)——复杂情况

1. 表的设计 三大范式&#xff1a; 一对一&#xff1a;如一个学生可以有一个学号&#xff0c;一个学号只能被一个学生拥有 一对多&#xff1a;如一个学生只能属于一个班级&#xff0c;但一个班级可以有多个学生&#xff08;这种方案在MySQL中是不可行的&#xff0c;但在有些…

深入浅出mediasoup—关键帧请求

当丢包或者解码错误导致无法正确解码视频流&#xff0c;或者当一个新的接收者加入到视频通话时&#xff0c;需要一个关键帧来恢复和开始正常解码。关键帧请求机制是确保视频流在不可靠网络环境下能够恢复和维持高质量播放的关键技术之一&#xff0c;mediasoup 支持关键帧请求。…

一文掌握YOLOv1-v10

引言 YOLO目标检测算法&#xff0c;不过多介绍&#xff0c;是基于深度学习的目标检测算法中最出名、发展最好的检测器&#xff0c;没有之一。本文简要的介绍一下从YOLOv1-YOLOv10的演化过程&#xff0c;详细技术细节不过多介绍&#xff0c;只提及改进点&#xff0c;适合初学者…

每日OJ_牛客_HJ91 走方格的方案数

目录 牛客HJ91 走方格的方案数 解析代码 牛客HJ91 走方格的方案数 走方格的方案数_牛客题霸_牛客网 解析代码 本题为求取路径总数的题目&#xff0c;一般可以通过递归求解&#xff0c;对于复杂的问题&#xff0c;可以通过动态规划求解。此题比较简单&#xff0c;也可以通过递…

AI学习记录 - transformer的位置编码的理解

看完肯定懂&#xff0c;可能会更新 一看位置编码公式&#xff0c;感觉很懵逼 懵逼四点&#xff1a;&#xff08;或者你还有其他不懂的点&#xff09; 1、为什么使用正弦余弦公式&#xff1f;不可以使用其他公式&#xff1f; 2、为什么奇数位置使用余弦&#xff0c;偶数位置使…

向量数据库:从0到original paper

向量数据库相关概念 亿点点历史知识 LLM的模型发展历史&#xff0c;Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond1&#xff1a; 很多人都是从ChatGPT爆点后才逐渐了解到大模型&#xff0c;但在爆点的前几年大模型的发展已经开始了诸神之战。一…

网络服务综合项目(一键部署shell脚本)

目录 需求&#xff1a; 主机环境描述 注意&#xff1a; 项目需求&#xff1a; 代码讲解 配置本地仓库 安装软件包 配置防火墙 配置策略中的一个布尔值 配置web服务 配置网络仓库 配置DNS服务 配置NTP服务 配置MySQL服务 配置NFS服务 配置论坛服务 进入网站配置…