c++取经之路(其六)——类与对象初始化列表,类的隐式转换,explict,static修饰成员

news2024/11/30 0:52:53

今天我们来讲一些很散的东西,通过这些很散的东西我们可以使我们之前学的东西更加通透,基本上把这些知识搞定,类与对象的知识基本上就差不多掌握了。

初始化列表:

定义:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

这里我们不得再谈谈我们的构造函数了,我们通过一段代码来理解。


 class A {
 public :
	 A(int a=-1,int b=-20);

	
 private:
	 int _a;
	 int _b;
 };


 A::A(int a, int b) :_a(10), _b(20)// 初始化列表的写法,其实就是写再构造函数上的
 {

 }

 int main()
 {
	 A a1(20,15);
	 return 0;
 }

图解:

为证明这个说法,我们可以这样做:我们知道const修饰的数据只能在定义时赋值,不能在其他地方改变值,所以我们搞一个const修饰的数据。

放在初始化列表:

放在函数体内:

这足以证明,初始化列表是进行的定义,而函数体内进行的是成员的赋值。

其实我们不管有没有在初始化列表里定义成员,但是我们的初始化列表都会去过一遍每个成员,所以才使得,自定义类型回去调用他的默认构造,内置类型会让编译器来处理。

所以在这个代码中:


 class A {
 public :
	 A(int a=-1,int b=-20);
 private:
	 int _a;
	 int _b;
	 const int _c;
 };


 class B {
 public:

	 B(int d=100);

 private:
	 A _q1;
	 A _q2;
	 int _d;
 };


 A::A(int a, int b) :_a(a), _b(b),_c(100)
 {

 }


 B::B(int d )
 {

 }

 int main()
 {
	 A a1(20,15);
	 B b1;
	 return 0;
 }

b1的初始化:


类的隐式转换:

注意我们的类也可以隐式转换。
我们举个简单的例子:

我们来简单的画一个图

这就非常的通透了。

小优化->有些编译器遇到连续构造和拷贝构造,会直接就构造了,意思是不会经历中间的过程。
举个例子:

 class A {
 public:
	 A(int a = -1);
	 A(const A& ad);
	 ~A();
 private:
	 int _a;
 };



 A::A(int a) :_a(a)
 {
	 cout << " A::A(int a) :_a(a)" << endl;
 }

 A::~A()
 {
	 cout << "A::~A()"<<endl;
	 _a = -1;
 }

A::A(const A& ad)
 {
	cout << "A::A(A& a)" << endl;
	_a= ad._a;
 }


 A Func()
 {
	 A a=1;
	 return a;
 }

 int main()
 {
	 A a2=Func();
	 return 0;
 }

图解:

这里是vs2022的优化


explicit:

定义:修饰构造函数,使得不允许隐式转换
这里我们用张图简单带过:

此时就不能转换了,直接编译报错:


static修饰成员:

定义:声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。

我们来看static五个特性:

1. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明

比如我们要定义一个静态成员变量

声明:

定义:

2. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区

因此我们可以在构造和拷贝里面加上_cout++用来观察生成了多少个同样的类
我们看这个代码:

 class A {
 public:
		A(int a = -1);
		A(const A& ad);
		~A();
 private:
	 int _a;
	 static int _cout;
 };

 int A::_cout = 0;


 A::A(int a) :_a(a)
 {
	 _cout++;       //加一
 }

 A::~A()
 {
	 _a = -1;
 }

A::A(const A& ad)
 {

	_cout++;        //加一
	_a= ad._a;
 }

 int main()
 {
	 A a1 = 1;
	 A a2 = 2;
	 A a3 = 3;
	 return 0;
 }

图解:

3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问

注意:静态成员也是类的成员,受public、protected、private 访问限定符的限制
所以我们将private换成public就可以进行访问

 

4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员

这意味这只能访问静态成员。

访问非静态成员要报错。

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

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

相关文章

Python景区票务人脸识别系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Facade 外观

意图 为子系统中的一组接口提供一个一致的界面&#xff0c;Facade模式定义了一个高层接口&#xff0c;这个接口使得这一字系统更加容易使用。 结构 其中&#xff1a; Facade知道哪些子系统负责处理请求&#xff1b;将客户的请求代理给适当的子系统对象。 Subsystem classes…

Ai2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Adobe illustrator&#xff0c;常被称为“AI”&#xff0c;是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件。作为一款非常好的矢量图形处理工具&#xff0c;该软件主要应用于印刷出版、海报书籍排版、专业插画、多…

大数据测试:构建Hadoop和Spark分布式HA运行环境

随着大数据技术的不断发展&#xff0c;Hadoop和Spark已成为处理大规模数据的热门框架。在生产环境中&#xff0c;高可用性&#xff08;HA&#xff09;是至关重要的&#xff0c;以确保数据处理和分析任务不受中断。本文将详细介绍如何构建 Hadoop和Spark分布式HA运行环境&#x…

HarmonyOS开发实例:【任务延时调度】

介绍 本示例使用[ohos.WorkSchedulerExtensionAbility] 、[ohos.net.http]、[ohos.notification] 、[ohos.bundle]、[ohos.fileio] 等接口&#xff0c;实现了设置后台任务、下载更新包 、保存更新包、发送通知 、安装更新包实现升级的功能。 效果预览 使用说明 安装本应用之…

30K上岸,转鸿蒙开发之后直接乱杀!!

互联网太卷了&#xff0c;熬过了2023才发现&#xff0c;2024更难熬&#xff01;只因行业发展多年&#xff0c;人才过度饱和&#xff01;那前端的出路在哪里&#xff1f;我推荐大家学【华为鸿蒙原生应用开发】新兴行业需求大&#xff0c;各大厂都在高薪抢人&#xff0c;然后前端…

数据的表示和运算—2

1.算术逻辑单元(ALU) 输入信号:A和B为要进行计算的两个操作数。(本质上就是高低电频电信号) 输出信号:输出运算结果 控制信号:由控制单元(CU)发出&#xff0c;解析指令的含义&#xff0c;解析完发出控制信号&#xff0c;M表示做什么运算,M1(逻辑运算) M0(算术运算) S0 ~ S3指明…

Vue3从入门到实战:深度掌握组件通信(下部曲)

5.组件通信方式5-$attrs $attrs的概念&#xff1a; 在Vue中&#xff0c;$attrs 是一个特殊的属性&#xff0c;用于访问父组件向子组件传递的非特定属性。它可以让子组件轻松地获取父组件传递的属性&#xff0c;而无需在子组件中显式声明这些属性。 想象一下你有一个父组件和…

vue3第二十节(新增编译宏defineModel)

为什么会需要使用defineModel() 注意&#xff1a;defineModel() 需要在3.4及以上版本才可使用&#xff1b; 组件之间通讯&#xff0c;通过 props 和 emits 进行通讯,是单向数据流&#xff0c;比如&#xff1a;props是自上而下的&#xff08;父组件数据修改导致子组件更新&…

别找了,这35份Excel自动排班表真的好用!

别再自己做排班表了&#xff0c;调了半天不好看格式还不对。 看看自己需要的是哪些类型的排班表&#xff1f;是公司值班&#xff0c;还是直播排班&#xff0c;还是考勤汇总&#xff0c;总有一个适合你。 刚整理的35份办公常用的排班表&#xff0c;希望能帮到你&#xff01; …

[lesson39]逗号操作符的分析

逗号操作符的分析 逗号操作符 逗号操作符(,)可以构成逗号表达式 逗号表达式用于将多个子表达式连接成为一个表达式逗号表达式的值为最后一个子表达式的值逗号表达式中的前N-1个子表达式可以没有返回值逗号表达式按照从左向右的顺序计算每个子表达式的值 重载逗号操作符 在C…

李廉洋:4.17晚间现货黄金,WTI原油美盘晚间操作及策略。

现在是否正在上演货币战&#xff0c;这对外汇和股票交易员意味着什么&#xff1f;在我看来这并不是一场货币战。实际情况是美元强势升值和亚洲货币普遍贬值&#xff0c;这其实是二阶段效应。由于美国通胀较预期更有粘性&#xff0c;经济数据也强于预期&#xff0c;美联储又变的…

monkey大全!可直接运用在项目中的常规monkey命令

测试步骤 adb devices-----了解包名-----adb shell monkey -----p 包名 ----v 运行次数&#xff08;多个参数的组合形成不同的用例以求最大的覆盖&#xff09;-----当崩溃或无响应时分析monkey日志 常规monkey命令 &#xff08;可直接在项目里使用&#xff09; adb shell m…

【计算机考研】目标学校改考408,报考人数大量减少,第二年能捡漏吗?

关键还是要看往年&#xff0c;最近三年的成绩。如果突然暴跌的话一定要注意第二年是否会弹很厉害。有时候408的学校就是一场博弈论&#xff0c;选择大于努力。 从大部分情况来看&#xff0c;爆冷后第一年回弹还是有限&#xff0c;但是第三年可能会爆热。 然后谈一下备考。 首…

信息系统项目管理师0053:设计和实施(4信息系统管理—4.1管理方法—4.1.3设计和实施)

点击查看专栏目录 文章目录 4.1.3设计和实施1.设计方法2.架构模式4.1.3设计和实施 开展信息系统设计和实施,首先需要将业务需求转换为信息系统架构,信息系统架构为将组织业务战略转换为信息系统的计划提供了蓝图。信息系统是支持组织中信息流动和处理的所有基础,包括硬件、软…

Seaborn:推荐一个好用的Python可视化工具

1. 引言 Seaborn 是建立在 matplotlib 基础上的数据可视化库&#xff0c;并与 Python 中的 pandas 数据结构紧密结合。可视化是 Seaborn 的核心部分&#xff0c;有助于直观的理解数据。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. 安装 Seaborn库主要提供以下功能…

论文DOI号相关及在latex中添加DOI跳转

DOI与ISBN, ISSN的不同之处 图书和期刊内容都使用DOI。 与ISBN和ISSN不同的是&#xff0c;ISBN喝ISSN可以识别图书或期刊&#xff0c;DOI可以识别单个章节或单篇文章。 所以&#xff0c;如果要搜寻某本书籍&#xff0c;需要用到的是ISBN号&#xff1b;如果要搜寻某本期刊&…

微服务组件-注册中心

微服务组件-注册中心 使用restTemplate实现远程服务调用存在以下的问题&#xff1a; 1、消费者不知道如何获取服务提供者具体信息。 2、在远程调用的过程中&#xff0c;直接采用填写url的硬编码方式&#xff0c;如果服务消费者发生变化&#xff0c;得到的结果就会出错。 3、如果…

机器学习-随机森林算法预测房租模型

文章目录 机器学习-随机森林算法预测房租模型解决问题数据集探索性数据分析数据预处理构建模型并训练结果分析与评估参数调优结果预测经验总结参考文章 机器学习-随机森林算法预测房租模型 解决问题 根据待租房源相关信息&#xff0c;通过随机森林机器学习算法构件预测模型&a…

代码随想录算法训练营第二十九天|491.递增子序列、46.全排列、46.全排列II

491. 非递减子序列 思路&#xff1a; 在90.子集II (opens new window)中我们是通过排序&#xff0c;再加一个标记数组来达到去重的目的。 而本题求自增子序列&#xff0c;是不能对原数组进行排序的&#xff0c;排完序的数组都是自增子序列了。 所以不能使用之前的去重逻辑&…