C++类和对象(4)

目录

1.初始化列表

2.单参数里面的隐式类型转换

3.多参数的隐式类型转换

4.匿名对象


1.初始化列表

(1)首先看一下初始化列表具体是什么?

这个就是初始化列表的具体形式,对,你没有看错,这个初始化列表里面的函数体部分是空的;

我们的初始化列表就是在形参括号的后面加上冒号,接下来就是三个相同的结构,这三个结构是用逗号分隔开的,这个结构的组成就是成员变量+括号(形参);

(2)我们必须要知道的是,我们一般是把成员变量定义为private实际上这个进行的不是变量的定义,而是变量的声明,变量的定义实际上是在初始化列表的地方进行定义的;

(3)初始化列表,毫无疑问,就是对变量进行初始化的,我们可以对所有的成员变量进行初始化,我们也可以对部分成员进行初始化,就算我们不进行初始化,编译器自动进行的;

编译器对初始化列表的执行顺序不会按照我们写的顺序,而是按照private里面的成员变量声明的顺序,这个通过调试是可以看到的;

(4)我们可以把这个初始化列表和函数体结合起来使用,就像下面的这样:

就是初始化的时候,我们的初始化列表里面只写一部分变量,剩下的变量的初始化可以在函数体里面完成;

(5)再结合一下我们前面提及到的缺省参数,我们的缺省参数是在声明的时候给出来的 (通俗而言就是在写private里面的变量的时候给缺省参数):

这个缺省参数实际上就是传递给了初始化列表,我们是可以验证这个过程的,

(6)下面的就是验证过程,也可以加深我们对于知识的理解:

我这里验证的时候只给了day这个成员变量缺省值1,但是在主函数里面进行对象的创建时,肯定会调用默认的构造函数,并且把2024,5,9这三个参数传给对应的值;

我们进行调试就可以发现,这个过程里面day这个成员变量得知会发生变化的:

上面显示的是变化之后的结果:就是调试的箭头指向26行的时候,监视窗口里面的day是1,当我们的调试箭头指向27行之后,监视窗口里面的day的值就变成了现在的9,可见这个缺省参数的值是传递给了初始化列表的,之后不过这个缺省参数被我们后来的参数给覆盖掉了;

(7)我们建议在进行成员变量的定义的时候使用初始化列表,而且顺序尽量和成员变量声明的顺序一样;实质上初始化列表就是我们的默认构造函数的一部分;

2.单参数里面的隐式类型转换

(1)什么是隐式类型转换,简单的讲,就是把不能类型的变量之间可以相互的赋值但是不会报错,我们通过下面这个简单的例子了解一下:

这个就是隐式类型转换的常见的例子,本来c是int类型的数据,但是他可以接受a这个double类型的数据的赋值,这个过程就发生了隐式类型的转换;

具体原理如下(这个后面的类和对象的隐式类型转换用的也是这个原理):就是我们的a实际上是创建了一个临时变量接受这个a的值,然后再把这个临时变量拷贝给我们这里写的变量c,因为我们的临时变量具有常属性,如果我们的c前面没有const进行修饰,就会报错;

原因就是前面提到的临时变量具有常属性,不可以修改,我们不加const相当于是权限的放大,所以加上const相当于是权限的平移,这样才不会报错;

(2)不仅是内置的数据类型例如int,double存在这种隐式类型的转换,在我们的类和对象里面同样存在这种隐式类型的转换,原理基本上都是差不多的:

上面的这个例子值得我们好好的进行分析:

首先是他使用了这个隐式类型转换的语法,我们同样要在a这个引用的对象前面加上const这样才可以算得上是权限的平移,否则同样会报错;

其次,我们一定要注意这里的a aa2=2这句代码,看似是一个简单的代码,实际上他需要我们好好理解:这里实际上进行了编译器的优化,怎样进行优化的呢?

(3)编译器的优化,想必大家一定了解过,这个编译器的优化就是因为编译器的版本过高 出现的问题,优化的实质就是将一些具体的原理给简化了:

这里的a aa2=2是如何进行优化的呢?底层上来讲,2首先会有一个临时变量进行接收,这个临时变量在执行拷贝构造函数,是拷贝构造函数把2这个是传递给了我们的成员变量;

优化之后是怎样进行的呢?优化之后省去了拷贝的过程和临时变量的创建,直接执行的就是构造函数,我们透过这个打印结果是可以看出来的:

(4)对于这个隐式类型转换,我们是可以避免的,就是我们可以使用一些手段不允许编译器进行上面的隐式类型转换,就是在构造函数前面加上explicit关键字,就可以让编译器无法进行隐式类型转换,加上这个关键字的后果就是我们的不同类型数据之间的赋值就会报错(实际上我们一般不会这样做)。

3.多参数的隐式类型转换

(1)上面介绍的是单参数的隐式类型转换,下面我们看一下多个参数的,唯一的不同就是我们这里使用了大括号,其他的原理都是相同的,这里同样是进行了优化的操作

(2)C++11支持多参数的隐式类型转换。

4.匿名对象

(1)匿名对象,与之对应的就是普通的对象,126行就是一个普通的对象,127行就是定义了一个匿名的对象;

(2)匿名对象一般是针对什么场景进行使用的呢?匿名对象一般是针对的只会使用一次的对象进行使用的;

(3)匿名对象和普通对象的区别:普通对象的生命周期在当前的局部域,匿名对象的生命周期是在这一行,在这里的匿名对象的生命周期就在127行,我们这里可以写一行析构函数打印输出查看这个匿名对象的创建和销毁;

(4)匿名对象怎么用:假如有一个solution函数,我们使用普通的对象,先创建bb2在使用bb2这个对象调用这个solution函数,这里显得很费劲,我们创建这个对象就是为了调用这个solution函数

(5)匿名函数可以不创建对象就可以调用这个函数,如132行里面,b(6)实际上就是默认的构造函数,他在这里就相当于是一个匿名对象(因为我们可以发现匿名对象在创建的时候,和有参数的构造函数的写法是一样的),因此我们的132行相当于是创建匿名对象去调用这个solution函数,我们以后见到理解即可。

 

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

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

相关文章

Hotcoin Research | 模块化将是大势所趋:拆解模块化区块链的现状和未来

关于模块化区块链叙事的讨论源于Celestia和其代币TIA的亮眼表现。实际上,模块化是未来区块链设计的主要发展方向和大势所趋。模块化区块链就像乐高积木一样,将区块链系统拆分为可重用的模块,通过定制组合可实现不同功能的区块链网络。这种灵活…

锂电池恒流恒压CCCV充电模型MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) CCCV简介 CCCV充电过程是恒流充电(CC)和恒压充电(CV)的结合。在CC阶段对电池施加恒定电流,以获得更快的充电速度,此时电池电压持续升高…

C++基础——输入输出(文件)

一、标准输入输出流 C 的输入输出是程序与用户或外部设备(如文件、网络等)之间交换信息的过程。 C 提供了丰富的标准库来支持这种交互,主要通过流的概念来实现。 流:抽象概念,表示一连串的数据(字节或字…

C++语言·string类

1. 为什么有string类 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数(strcpy,strcat),但是这些库函数与字符串是分离开的,不太符合OOP(Object Oriented Programming面向对…

Java 语法 (杂七杂八的知识)

面向对象三大特性 封装, 多态, 继承 基本数据类型 一字节 (Byte) 占八位 (bit) JDK, JRE, JVM JDK (Java Development Kit) : Java 开发工具包, 包括了 JRE, 编译器 javac, 和调试工具 Jconsole, jstack 等 JRE (Java Runtime Environment) : Java 运行时环境, 包括了 JVM , …

【牛客】Tokitsukaze and Average of Substring

原题链接:登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 前缀和。 开一个int类型的前缀和数组pre[30][N](pre[i][j]表示某字符转成的数字 i 在一段区间的前缀个数。因为字母表有‘a’~z…

【使用ChatGPT的API之前】OpenAI API提供的可用模型

文章目录 一. ChatGPT基本概念二. OpenAI API提供的可用模型1. InstructGPT2. ChatGPT3. GPT-4 三. 在OpenAI Playground中使用GPT模型-ing 在使用GPT-4和ChatGPT的API集成到Python应用程序之前,我们先了解ChatGPT的基本概念,与OpenAI API提供的可用模型…

云原生Kubernetes: K8S 1.29版本 部署Harbor

目录 一、实验 1.环境 2.Linux 部署docker compose 3.证书秘钥配置 4.K8S 1.29版本 部署Harbor 5.K8S 1.29版本 使用Harbor 二、问题 1.docker 登录harbor失败 一、实验 1.环境 (1)主机 表1 主机 主机架构版本IP备注masterK8S master节点1.2…

java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条

今天遇到一个问题 系统线上问题,经常出现这样的问题,刚重启系统时不报错了,可是运行一段时间又会出现。sql已经写了limit 1,mybatis的debug日志也返回total为1,可是却报错返回了1805条数据 乍一看,感觉太不…

基于Spring Boot的公司OA系统设计与实现

基于Spring Boot的银行OA系统设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea 系统部分展示 用户登录界面,在银行OA系统运行后&#x…

基于springboot+jsp+Mysql的商务安全邮箱邮件收发

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

STM32单片机实战开发笔记-PWM波输出频率及占空比配置【wulianjishu666】

单片机物联网开发资料: 链接:https://pan.baidu.com/s/1XzodQuML7CqZ4ZKinDGKkg?pwdbgep 提取码:bgep PWM模块测试 功能描述 脉冲宽度调制模式: PWM边沿对齐模式: 向上计数配置 当TIMX_CR1寄存器中的DIR为低的时…

基于Python的LSTM网络实现单特征预测回归任务(TensorFlow)

单特征:数据集中只包含2列,时间列价格列,仅利用价格来预测价格 目录 一、数据集 二、任务目标 三、代码实现 1、从本地路径中读取数据文件 2、数据归一化 3、创建配置类,将LSTM的各个超参数声明为变量,便于后续…

php开发-个人博客项目文件操作类编辑器上传下载删除读写

特地整了个软件 这就舒服了 文件操作类的开发 文件的任意上传,下载,读取,删除操作等 1.文件上传类-任意文件上传 分为三类 1,代码自主编写的 先写一个html的上传表单,这个网上搜索就有 标题看着不够明确啊&#…

【牛客】【模板】差分

原题链接:登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分模板。 b[0]a[0]; b[1]a[1]-a[0]; b[2]a[2]-a[1]; ...... b[n-1]a[n-1]-a[n-2]; b[n]a[n]-a[n-1]; 差分标记:b[l]k,b…

计算机网络chapter1——家庭作业

文章目录 复习题1.1节(1) “主机”和“端系统”之间有何不同?列举几种不同类型的端系统。web服务器是一种端系统吗?(2)协议一词常用来用来描述外交关系,维基百科是如何描述外交关系的&#xff1…

基于Springboot的校园悬赏任务平台(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的校园悬赏任务平台(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

Codigger:Web应用让开发者拥有更高效的开发之旅

在当今软件开发领域,Web应用以其跨平台、易访问和实时更新的特性,逐渐成为了主流的开发方向。从开发者的视角来看,Codigger借助B/S(浏览器/服务器)架构和云计算技术,为开发者带来了诸多便利和优势。这些优势…

【负载均衡式在线OJ项目day1】项目结构

一.功能 查看题目列表,在线编程,判题功能,即leetcode的部分功能 二.宏观结构 整个项目是BS模式,客户端是浏览器,和用户交互并向服务器发起请求。 服务端从功能上来说分为两个模块,第一个是OJServer&…

C++ 多态(一)

一、多态定义 同一种操作作用于不同的对象时,可以产生不同的行为。在面向对象编程中,多态性是指通过继承和重写实现的,同一个方法在不同的子类中可以表现出不同的行为。多态性可以提高代码的灵活性和可扩展性,使得程序更易于维护…