初始化列表和explicit关键字和static成员

news2024/9/21 16:43:13

初始化列表

1.初始化和赋值的概念:

首先我们先来了解一下成员变量初始化和赋值的概念,初始化是是对成员变量进行一次赋值,注意是只能一次赋值,而赋值是可以多次进行赋值的。

2.初始化列表的引出:

我们知道了初始化和赋值的概念之后,我们知道构造函数可以对成员变量进行初始化,但在构造函数体中的赋值真的是初始化吗?我们来验证一下吧!

Date(int year=0,int month=0,int day=1)
{
	_year = year;
	_month = month;
	_day = day;

	_year = 2;
	_month = 2;
	_day = 2;
}

上面的代码就是一个构造函数,对年月日进行初始化,我们可以看到在构造函数体中,我对年月日进行了两次的赋值操作,如果编译运行没问题,则根据赋值和初始化的概念就可以得出在函数体中的赋值不是初始化。那么我们来看看代码运行的结构吧。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以看到,在构造函数体中我们可以进行多次的赋值操作,那么证明在构造函数体中的赋值并不是真正的初始化。

3.初始化列表

(1)初始化列表语法格式:以一个冒号开始,接着是以一个逗号分隔的数据成员列表,每一个**"成员变量"后面跟一个放在括号中的初始值**/表达式

看文字定义是不是有点蒙,没关系,下面举一个例子就一下子明白了。

Date(int year=0, int month=1, int day=1)
	:_year(year)//year表示形参所接收到的值
	, _month(month)//month表示形参所接收到的值
	, _day(day)//day表示形参所接收到的值
{
	
}

看一下代码运行结果
在这里插入图片描述
在这里插入图片描述
这个就是初始化列表的定义!

(2)定义初始化列表需要注意的事项:

1.每一个成员变量只能在初始化列表中出现一次。
2.类中出现引用(在创建时就必须初始化了,而不是实例化时才进行初始化),const(只能进行一次的初始化)
3.自定义类型成员(且该类没有默认构造函数时)必须使用初始化列表进行初始化(没有默认的构造函数的自定义成员变量如果使用构造函数体进行初始化会调用它自身的拷贝构造函数,如果使用初始化列表会减少不必要的拷贝构造,提高效率)。
4.尽量使用初始化列表进行初始化
5.成员变量在类中的声明次序,就是成员变量初始化的顺序,与它在初始化列表中初始化的顺序无关。

这个是在类中的成员变量声明的顺序,下面我们来看看它们在初始化列表中的初始化顺序

int _year;//这里命名加_是为了和形参区别开来
int _month;
int _day;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

explicit关键字

众所周知,构造函数不仅可以用于初始化成员变量。也可以对于只有单个参数第一次参数无默认值,其余参数均有默认值的构造函数进行类型的转换,虽然这个类型转换大多数情况是意外的,

class Date
{
public:
	Date(int year,int month=1,int day=1)
		: _year(year)
	{

	}
private:
	int _year;//这里命名加_是为了和形参区别开来
	int _month;
	int _day;
};


int main()
{
	Date d1(2023);
	d1 = 2022;
	return 0;
}

在这里插入图片描述

这个代码运行没有任何问题,但是我们看一下Date成员实例化时,明明Date是一个日期值,有年月日,但现在只给一个整形值就可以初始化了这个日期类了,这是为什么呢?
实际上是编译器会把2023构造成一个无名的类,然后再把这个无名的类对d1进行赋值,这个就是隐式类型转换。

如果我在构造函数前面加上explicit关键字呢?
在这里插入图片描述
代码直接就报错了,这个证明explicit是为了防止构造函数进行隐式类型转换的关键字。

static成员

(1)定义:

在c语言中我们就学习过static关键字了,用static修饰一个变量,让这个变量变成静态成员变量,从而延长它的生命周期。
在c++中static不仅可以修饰一个成员变量,还可以修饰成员函数,
修饰的成员变量叫静态成员变量,修饰的成员函数叫静态成员函数,
静态成员变量一定是在类外进行定义(静态成员变量要在类对象被创建之前就要初始化了,如果在类中定义就无法达到在类对象创建之前进行初始化)

class Date
{
public:

	
private:
	//静态成员变量的声明
	static int _year;//这里命名加_是为了和形参区别开来
	
};

//静态成员变量的定义
int Date::_year = 1;

(2)static成员特性

1.静态成员为所有类的对象进行共享,存放在数据段中。
2.静态成员必须在类外进行定义,在类外进行定义时,不需要加static关键字,在类中只是声明
3.类静态成员可以使用类名::静态成员/对象.静态成员进行访问
4.静态成员没有this指针,不能访问非静态成员,非静态成员可以访问静态成员。
5.静态成员也受访问限定符的限制

(3)练习

实现一个类,计算程序中一共创建了多少个类对象

我们知道创建类对象时,一定会调用构造函数/拷贝构造函数进行初始化,调用析构函数进行销毁。所以当调用一次构造函数/拷贝构造函数时,那么我就++计数的静态成员变量,调用一次析构函数,那么我就–计数的静态成员变量

class A
{
public:
	A()
	{
		_count++;
	}

	A(const A& count)
	{
		_count++;

	}

	~A()
	{
		_count--;
	}

	void Print()
	{
		cout << _count << endl;
	}

private:
	static int _count;
};

int A::_count = 0;


int main()
{
	A d1;
	A d2;
	A d3;
	A d4;
	A d5;


	return 0;
}

在这里插入图片描述

总结:

今天总结了初始化列表和explicit关键字和static关键字,内容有点多,可以慢慢消化,加油!

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

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

相关文章

ftp pool 功能分析及 golang 实现

本文探究一种轻量级的 pool 实现 ftp 连接。 一、背景 简要介绍&#xff1a;业务中一般使用较多的是各种开源组件&#xff0c;设计有点重&#xff0c;因此本文探究一种轻量级的 pool 池的思想实现。 期望&#xff1a;设置连接池最大连接数为 N 时&#xff0c;批量执行 M 个 F…

Transformer模型:Decoder的self-attention mask实现

前言 这是对Transformer模型Word Embedding、Postion Embedding、Encoder self-attention mask、intra-attention mask内容的续篇。 视频链接&#xff1a;20、Transformer模型Decoder原理精讲及其PyTorch逐行实现_哔哩哔哩_bilibili 文章链接&#xff1a;Transformer模型&…

【JVM实战篇】内存调优:内存泄露危害+内存监控工具介绍+内存泄露原因介绍

文章目录 内存调优内存溢出和内存泄漏内存泄露带来什么问题内存泄露案例演示内存泄漏的常见场景场景一场景二 解决内存溢出的方法常用内存监控工具Top命令优缺点 VisualVM软件、插件优缺点监控本地Java进程监控服务器的Java进程&#xff08;生产环境不推荐使用&#xff09; Art…

JavaWeb(三:JDBC 与 MVC)

JavaWeb&#xff08;一&#xff1a;基础知识和环境搭建&#xff09;https://blog.csdn.net/xpy2428507302/article/details/140365130?spm1001.2014.3001.5501JavaWeb&#xff08;二&#xff1a;Servlet与Jsp&#xff0c;监听器与过滤器&#xff09;https://blog.csdn.net/xpy…

Python蜂窝通信Wi-Fi和GPU变分推理及暴力哈希加密协议图消息算法

&#x1f3af;要点 &#x1f3af;图模型和消息传递推理算法 | &#x1f3af;消息传递推理和循环消息传递推理算法 | &#x1f3af;空间人工智能算法多维姿势估计 | &#x1f3af;超图结构解码算法量子计算 | &#x1f3af;GPU处理变分推理消息传递贝叶斯网络算法 | &#x1f3…

5G-A通感融合赋能低空经济-RedCap芯片在无人机中的应用

1. 引言 随着低空经济的迅速崛起&#xff0c;无人机在物流、巡检、农业等多个领域的应用日益广泛。低空飞行器的高效、安全通信成为制约低空经济发展的关键技术瓶颈。5G-A通感一体化技术通过整合通信与感知功能&#xff0c;为低空网络提供了强大的技术支持。本文探讨了5G-A通感…

【中国近代史】林则徐虎门销烟(1839年)

中国古代朝代历史经过两周时间&#xff08;7.03-7.13&#xff09;的分享已经正式结束&#xff0c;首先感谢大家通过那个专栏点赞收藏关注我&#xff0c;这是我继续创作的动力。 接下来新的专栏就是中国近代史。让我们再次走入近代史的潮流中&#xff0c;去学习去感受先辈们的拼…

计组_多处理器的基本概念

2024.06.26&#xff1a;计算机组成原理多处理器的基本概念学习笔记 第21节 多处理器的基本概念 1. 计算机体系结构1.1 SISD单指令流单数据流&#xff08;前面几章一直在学习的内容&#xff09;1.2 SIMD单指令流多数据流1.2.1 改进&#xff1a;向量处理器 1.3 MISD多指令流单数据…

应用帕累托原则学习新的编程语言

在本文中&#xff0c;我将讨论如何应用帕累托原则快速学习一门新的编程语言&#xff0c;并在加深对编程语言的理解的同时开始解决实际问题。 什么是帕累托原则&#xff1f; 帕累托原则&#xff0c;又称 80/20 法则&#xff0c;指出对于许多结果而言&#xff0c;大约 80% 的后…

数据湖仓一体(一) 编译hudi

目录 一、大数据组件版本信息 二、数据湖仓架构 三、数据湖仓组件部署规划 四、编译hudi 一、大数据组件版本信息 hudi-0.14.1zookeeper-3.5.7seatunnel-2.3.4kafka_2.12-3.5.2hadoop-3.3.5mysql-5.7.28apache-hive-3.1.3spark-3.3.1flink-1.17.2apache-dolphinscheduler-3.1.9…

我的智能辅助大师-办公小浣熊

一、基本介绍 随着2022年ChatGPT为代表的AI工具对互联网领域进行第一次冲击后&#xff0c;作为一名对编程领域涉足不算特别深的一名程序员&#xff0c;对AI大模型的接触也真的不能算少了&#xff0c;这是时代的必然趋势。在此之前也曾接触过很多的AI工具&#xff0c;他们都能在…

跨境电商系统如何进行搭建

目前越来越多的商家&#xff0c;他们都在进行跨境电商建站&#xff0c;便于自己在网络上进行营销推广&#xff0c;跨境电商系统的搭建是至关重要的&#xff0c;商家应该先了解跨境电商的模式有哪些&#xff0c;这样才能对跨境电商系统有更好的搭建结果。 跨境电商模式 目前来…

1589. 【中山市第十二届义务教育段学生信息学邀请赛】象战(bishop)(Standard IO)

题目描述 国际象棋的棋盘可以表示为一个 8 行 8 列的格子图&#xff0c;其中每个格子都可以放一枚棋子。我们将第 1 行第 2 列的格子用 (1,2) 来表示&#xff0c;以此类推。 为了帮助妹妹认识国际象棋中的“象”这种棋子&#xff0c;Jimmy 可谓是煞费苦心——他首先教会妹妹&…

【Java】数据类型及类型转换

数据类型 Java语言的数据类型分为两大类&#xff1a; 基础数据类型引用数据类型 基础数据类型 基础数据类型包括以下8种&#xff1a; 类型名称关键字占用内存取值范围区间描述字节型byte1 字节-128~127-27~27-1短整型short2 字节-32768~32767-215~215-1整型int4 字节-2147…

算法学习笔记(8.3)-(0-1背包问题)

目录 最常见的0-1背包问题&#xff1a; 第一步&#xff1a;思考每轮的决策&#xff0c;定义状态&#xff0c;从而得到dp表 第二步&#xff1a;找出最优子结构&#xff0c;进而推导出状态转移方程 第三步&#xff1a;确定边界条件和状态转移顺序 方法一&#xff1a;暴力搜素…

经典元启发式算法的适用范围及基本思想

元启发式算法是针对优化问题设计的一类高级算法&#xff0c;它们具有广泛的适用性&#xff0c;可以解决不同类型的问题。不同的元启发式算法由于其特定的搜索机制和策略&#xff0c;适用的优化问题类型也有所不同。以下是一些常见元启发式算法及其适用范围&#xff1a; 1. 遗传…

OrangePi AIpro 浅上手及搭建卡通图像生成多元化AI服务

前言 很高兴&#xff0c;收到了一份新款 OrangePi AIpro 开发板&#xff0c;这是香橙派第一次与华为昇腾合作&#xff0c;使用昇腾系列 AI 处理器来设计这款高性价比的 AI 开发板。这块开发板不仅性能强大&#xff0c;还支持丰富的硬件接口&#xff0c;为AI开发者提供了一个理…

Nginx的访问限制与访问控制

访问限制 访问限制是一种防止恶意访问的常用手段&#xff0c;可以指定同一IP地址在固定时间内的访问次数&#xff0c;或者指定同一IP地址在固定时间内建立连接的次数&#xff0c;若超过网站指定的次数访问将不成功。 请求频率限制配置 请求频率限制是限制客户端固定时间内发…

代码随想录第十二天|226.翻转二叉树、 101.对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

文章目录 226.翻转二叉树思路解法一、前序遍历递归解法二、深度优先搜索--迭代 101.对称二叉树思路解法一、递归解法二、迭代 104.二叉树的最大深度解法一、深度优先搜索--递归解法二、广度优先搜索--迭代 111.二叉树的最小深度解法一、深度优先搜索--递归解法二、广度优先搜索…

制作显卡版docker并配置TensorTR环境

感谢阅读 相关概念docker准备下载一个自己电脑cuda匹配的docker镜像拉取以及启动镜像安装cudaTensorRT部署教程 相关概念 TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个模型推理框架&#xff0c;支持C和Python推理。即我们利用Pytorch&#xff0c;Tensorflow或者其它框架…