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函数,我们以后见到理解即可。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python:画折线图

import pandas as pd import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties# 设置新宋体字体的路径 font_path D:/reportlab/simsun/simsun.ttf# 加载新宋体字体 prop FontProperties(fnamefont_path)""" # 读取 xlsx 文件 d…

【投资必看】充电桩加盟合作哪家好,充电桩厂家合作模式一般有哪些?

随着新能源汽车行业的蓬勃发展,充电桩作为关键的基础设施,其市场需求日益增长。对于有意进入这一行业的投资者来说,了解和选择适合的合作模式至关重要。充电桩厂家的合作模式一般有哪些,本文将从设备销售和投资运营两个维度进行讨…

容灾演练双月报|郑大一附院数据级容灾演练切换

了解更多灾备行业动态 守护数字化时代业务连续 目录 CONTENTS 01 灾备法规政策 02 热点安全事件 03 容灾演练典型案例 01 灾备法规政策 3月19日,工信部发布《工业和信息化部办公厅关于做好2024年信息通信业安全生产和网络运行安全工作的通知》。明确提出“…

官宣:vAsterNOS正式发布!开放网络操作系统免费试用!

近期,vAsterNOS(设备模拟器)正式发布,可以满足用户快速了解 AsterNOS、体验实际操作、搭建模拟网络的需求,可运行在GNS3、EVE-NG等网络虚拟软件中。 AsterNOS 网络操作系统是星融元为人工智能、机器学习、高性能计算、…

java培训班还值得去培训吗?

请大家关注我的公众号:老胡聊Java 1 应届生或者在校生,如果感觉有必要,可以去提升下技术,因为应届生或在校生找工作时,未必要提升真实项目经验,所以用应届生身份学到的spring boot等java技术背面试题&#…

《二十三》Qt 简单小项目---视频播放器

QT 使用QMediaPlayer实现的简易视频播放器 效果如下: 功能点 播放指定视频点击屏幕暂停/播放开始/暂停/重置视频拖拽到指定位置播放 类介绍 需要在配置文件中加入Multimedia, MultimediaWidgets这俩个库。 Multimedia:提供了一套用于处理音频、视频…

如何开启深色模式【攻略】

如何开启深色模式【攻略】 前言版权推荐如何开启深色模式介绍手机系统手机微信手机QQ手机快手手机抖音 电脑系统电脑微信电脑QQ电脑WPS电脑浏览器 最后 前言 2024-5-9 20:48:21 深色模式给人以一种高级感。 本文介绍一些常用软件深色模式的开启 以下内容源自《【攻略】》 仅…

基于Spring Boot的酒店管理系统设计与实现

基于Spring Boot的酒店管理系统设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea 系统部分展示 系统首页界面图,在系统首页可以查看首页…

【数据结构-二叉搜索树的增删查改】

🌈个人主页:努力学编程’ ⛅个人推荐:基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 …

python-类和对象

1、设计一个 Circle类来表示圆,这个类包含圆的半径以及求面积和周长的函数。再使用这个类创建半径为1~10的圆,并计算出相应的面积和周长。 (1)源代码: import math class Circle: def __init__(self, r): self.r r #面积 def area(self): r…

最佳实践 | 八爪鱼采集器如何用PartnerShare做全民分销?

在数字化时代,数据采集和分析已经成为企业运营和决策的重要一环。八爪鱼采集器作为一款领先的SaaS产品,凭借其强大的数据采集和处理能力,成为了众多企业和个人用户的心头好。为了进一步拓展市场份额,提升品牌影响力,八…

TCP通信并发:

上次的程序只能保持,单线程或者进程 多进程并发服务器 进程的特点(有血缘关系) 创建子进程:fork(); 虚拟地址空间被复制 ,从一份变成两份(用户区和内核区&#xff09…

国内如何访问 OpenAI 的 api

这个问题甚至我的一些大厂的朋友也不太清楚,所以我觉得有必备写一篇文章来简单盘盘它,希望能帮助到有需要的人 众所周知,由于大陆与 OpenAI 双方互相封锁,大陆是无法直接访问 OpenAI api 的 不过由于 GPT 4 的统治地位&#xff0c…

下一代自动化,国外厂商如何通过生成性AI重塑RPA?

企业自动化的未来趋势是什么?科技巨头们普遍认为,由生成性AI驱动的AI Agent将成为下一个重大发展方向。尽管“AI Agent”这一术语尚无统一定义,但它通常指的是那些能够根据指令通过模拟人类互动,在软件和网络平台上执行复杂任务的…

[C++核心编程-05]----C++类和对象之对象的初始化和清理

目录 引言 正文 01-构造函数和析构函数 ​02-构造函数的分类及调用 03-拷贝构造函数调用时机 04-构造函数调用规则 05-深拷贝与浅拷贝 06-初始化列表 07-静态成员变量 08-静态成员函数 …

Eigen求解线性方程组

1、线性方程组的应用 线性方程组可以用来解决各种涉及线性关系的问题。以下是一些通常可以用线性方程组来解决的问题: 在实际工程和科学计算中,求解多项式方程的根有着广泛的应用。 在控制系统的设计中,我们经常需要求解特征方程的根来分析…

【训练与预测】02 - 完整的模型验证套路

02 - 完整的模型验证套路 模型图 验证一个模型就是指使用已经训练好的模型,然后给它提供输入。 test.py import torch import torchvision from PIL import Imagedevice torch.device("cuda" if torch.cuda.is_available() else "cpu") ima…

C++学习笔记——仿函数

文章目录 仿函数——思维导图仿函数是什么仿函数的优势理解仿函数仿函数的原理举例 仿函数——思维导图 仿函数是什么 使用对象名调用operator()函数看起来像是在使用函数一样,因此便有了仿函数的称呼;仿函数存在的意义是&#x…

Burp Suite 抓包,浏览器提示有软件正在阻止Firefox安全地连接到此网站

问题现象 有软件正在阻止Firefox安全地连接到此网站 解决办法 没有安装证书,在浏览器里面安装bp的证书就可以了 参考:教程合集 《H01-启动和激活Burp.docx》——第5步

如何防止源代码泄露?彻底解决源代码防泄密的方法

SDC沙盒系统:数据安全的守护者 SDC沙盒系统,为研发型企业设计,实现了对数据的代码级保护,同时不影响工作效率和正常使用。系统通过自动加密敏感数据,并配合多种管控机制,有效防止了数据的泄露。 涉密可信…