当前位置: 首页 > news >正文

类和对象--中--初始化列表(重要)、隐式类型转化(理解)、最后两个默认成员函数

1.初始化列表

1.1作用:

通过特定的值,来初始化对象。

1.2定义:

初始化列表,就相当于定义对象(开空间)。不管写不写初始化列表,每个成员变量都会走一遍初始化列表(开出对应的空间)。这就是为什么无参构造函数,直接在函数体写赋值语句就好了,因为已经开好空间了。

注:初始化列表和拷贝构造有相同点,都需要传参。但是拷贝构造肯定要用这个参数来初始化对象,初始化列表可以不用这个参数,有这个参数,只是为了和默认构造区分开。

1.3格式:

初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。初始化列表需要传参。

注:

区分初始化和赋值。

1.4特性:

        1.每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地⽅。

        2.引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始化,否则会编译报错。

        3.C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的成员使⽤的。

        4.初始化列表中按照成员变量在类中声明顺序进⾏初始化,跟成员在初始化列表出现的的先后顺序⽆关。建议声明顺序和初始化列表顺序保持⼀致。

1.5案例:

案例一:                体现 特性1

案例一解析:

为什么只能出现一次?可以理解为,初始化列表就是定义变量的地方,类似于发生重定义。

(至于为什么这么理解,本人现在无法解释,先记忆住这个知识点吧。)

案例二:                拷贝构造和初始化列表的关系

既然初始化列表可以传参,那也可以将 类 传参。那么拷贝构造和初始化列表写法就一样了。哪个是拷贝?哪个是初始化列表?

                                                                构造:

                                                                初始化列表:

案例二解析:

初始化列表和拷贝构造,最根本的区别就是:初始化列表用不用这个参数,无所谓,拷贝构造要用这个参数来初始化对象。既然初始化列表可以不用这个参数,那么这个参数的价值是什么?为了和默认构造函数构成函数重载

代码参考:

class A {
public://无参构造A(){_a = 10;_b = 20;}//A()//	//:_a(100)//	//,_b(200)//{//_a = 15;//_b = 30;//_c = 50;//}A(const A& aa) {_a = aa._a;}//A(const A& bb)	//	//:_a(100)//	//,_b(200)//{//	_a = 15;//	_b = 30;//	_c = 50;//}private:int _a=0;int _b=0;int _c=0;
};
int main() {A a1;//哪个是拷贝?哪个是初始化列表?A a2(a1);A a3;getchar();return 0;
}

案例三:                特性2

案例三第一部分:                特性2

const修饰的变量和引用一样,这两者必须在初始化的时候就赋值。不能通过赋值语句来赋值。

为什么会报错?这就需要提及1.3的注了,这里函数体是赋值的地方。那怎样写才是对的?

案例三第一部分解析:

const 和 引用这是两个特例,需要格外记忆。

案例三第二部分:                特性2

案例三第二部分解析:

通过案例二,我们知道,初始化列表需要传参,是为了和构造函数,构成函数重载。而且初始化列表和构造的区别就是,初始化列表可以不用这个参数。

通过案例三第二部分,我们知道。如果 类(MuQueue) 成员有自定义类型(Stack),且该自定义类型没有默认构造,那么初始化 ,就会导致编译的时候就会报错。如果用初始化列表来初始化 ,就可以指定该自定义类型如何初始化。

代码参考:

class Stack {
public:Stack(int n) {_a = (int*)malloc(sizeof(int) * n);_top = 0;_capacity = n;}
private:int* _a;int _top = 0;int _capacity = 0;
};class MyQueue {
public:/*MyQueue() {cout << "MyQueue()" << endl;_size = 10010;}*/MyQueue(int n):pushst(n), popst(n), _size(0){cout << "MyQueue(int n) " << endl;}
private:Stack pushst;Stack popst;int _size;
};int main() {//调用的是构造函数//MyQueue q1;//调用的是初始化列表MyQueue q2(20);return 0;
}

案例四:                特性4

        

案例四解析:

在VS2019及之后的版本中。编译器优化掉这一部分了。这一特性仅供了解。

1.6思考:为什么要用初始化列表?初始化列表有什么用?我用构造函数,不能满足要求么?

答: 因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。

        如果你没有给缺省值,对于没有显⽰在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显⽰在初始化列表初始化的⾃定义类型成员会调⽤这个成员类型的默认构造函数,如果没有默认构造会编译错误。

1.6总结:

  • ⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表;
  • ⽆论是否在初始化列表显⽰初始化,每个成员变量都要⾛初始化列表初始化;

2.隐式类型转化

2.1作用:

提高了代码的效率,同时提高了代码的可读性。

2.2案例

案例一:                内置类型的隐式类型转化

                

                

案例一解析:

如果两个不同类型的对象要赋值。那么就会生成一个临时量来存值。

案例二:                自定义类型的隐式类型转化

        ​​​​​​​        

案例二解析:

第一个 a1 是什么,好理解,就是用的初始化列表。可是 a2 为什么没有报错啊?一个是 int 类型,一个是 A 类型。

这里就和 案例一 类似了。

而VS2019之后的版本,对于 连续的构造、拷贝构造,直接优化为构造了。没有中间的拷贝构造了。

当然,这里不会报错的本质是因为:A 类型是单参数(且是int 类型)的构造。

案例三:                隐式类型转化的好处

案例三解析:

提高了代码的可读性。

代码参考:案例五

案例四:                取消隐式类型转化

代码参考:案例五

案例五:                多参数的隐式构造

案例五解析:

多参数的,需要用 ' {} ' 。

代码参考:

class A {
public:A(int a, int b):_a1(a), _a2(b) {}
private:int _a1;int _a2;
};
class Stack {
public:void Push(const A& aa) {//...}
};
int main() {A test = { 100,200 };Stack st;st.Push(test);st.Push({100,200});return 0;
}

3.最后两个默认成员函数

3.1const来修饰成员函数(理解)

作用:

为了让传参的时候,发生权限的放大,导致调用函数失败。

格式:

在函数声明和定义的后面,加长const

案例一:

                

d1的权限是只读,但是print的参数权限是可读可写。

这里传参发生了,对参数权限的放大,所以会报错。如果用const修饰成员函数,那么就不会发生参数权限的放大。

案例二:

        ​​​​​​​        

这里很奇怪,只需要交换一下参数的顺序,就不会报错了。和案例一类似,在传参的时候权限发生了放大。

总结:

如果在给成员函数传参的时候,不想让参数在函数内得到改变,就将成员函数用const修饰(本质就是给成员函数的所有参数,加一个const)

        ​​​​​​​        ​​​​​​​        

3.2取地址操作符重载(了解)

取地址运算符重载分为普通取地址运算符重载const取地址运算符重载,⼀般这两个函数编译器⾃动⽣成的就可以够我们⽤了,不需要去显⽰实现。除⾮⼀些很特殊的场景,⽐如我们不想让别⼈取到当前类对象的地址,就可以⾃⼰实现⼀份,胡乱返回⼀个地址。

                  ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

都是获取一个地址,上面两张图,并没有什么明显的变化。

下面这张图就不是了:返回的是一个地址,至于能不能用,就不知道了。所以说,实践意义并不大。

相关文章:

类和对象--中--初始化列表(重要)、隐式类型转化(理解)、最后两个默认成员函数

1.初始化列表 1.1作用&#xff1a; 通过特定的值&#xff0c;来初始化对象。 1.2定义&#xff1a; 初始化列表&#xff0c;就相当于定义对象&#xff08;开空间&#xff09;。不管写不写初始化列表&#xff0c;每个成员变量都会走一遍初始化列表&#xff08;开出对应的空间…...

uni-app运行 安卓模拟器 MuMu模拟器

最近公司开发移动端系统&#xff0c;使用真机时每次调试的时候换来换去的麻烦&#xff0c;所以使用模拟器来调试方便。记录一下安装和连接的过程 一、安装MuMu模拟器 百度搜索MuMu模拟器并打开官网或者点这里MuMu模拟器官网 点击下载模拟器 安装模拟器&#xff0c;如果系统…...

java 打印对象所有属性的值 循环

在Java中&#xff0c;如果你想要打印一个对象的所有属性值&#xff0c;可以使用反射&#xff08;Reflection&#xff09;来获取对象的所有字段&#xff0c;并循环遍历这些字段以打印它们的值。以下是一个示例代码&#xff0c;展示了如何实现这一点&#xff1a; 示例类 假设我…...

k8s认证、授权

在 Kubernetes 中&#xff0c;kubectl auth can-i 命令用于检查当前用户或指定的 ServiceAccount 是否有权限执行特定的操作&#xff1a; kubectl auth can-i create deployment --as system:serviceaccount:default:dev-sa这个命令的作用是检查名为 dev-sa 的 ServiceAccount…...

基于spring boot的纺织品企业财务管理系统论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对纺织品企业财务信息管理的提升&…...

@RequestBody和前端的关系以及,如何在前后端之间传递数据?

RequestBody 注解在 Spring MVC 中用于将 HTTP 请求体中的数据绑定到控制器方法的参数上。为了更好地理解 RequestBody 和前端之间的关系&#xff0c;我们可以从以下几个方面进行探讨&#xff1a; 1. 请求体的格式 前端发送的请求体通常是一个 JSON 字符串&#xff0c;也可以…...

详解登录MySQL时出现SSL connection error: unknown error number错误

目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后&#xff0c;使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件&#xff0c;然后按下图所示添加配置 此时再…...

【大数据学习 | Spark-Core】Spark的改变分区的算子

当分区由多变少时&#xff0c;不需要shuffle&#xff0c;也就是父RDD与子RDD之间是窄依赖。 当分区由少变多时&#xff0c;是需要shuffle的。 但极端情况下&#xff08;1000个分区变成1个分区)&#xff0c;这时如果将shuffle设置为false&#xff0c;父子RDD是窄依赖关系&…...

Spring Boot Web应用开发:测试

在Spring Boot中&#xff0c;测试是开发过程的一个重要部分&#xff0c;它确保你的应用按预期工作&#xff0c;并且可以帮助你在早期发现和修复问题。Spring Boot提供了多种便捷的测试工具&#xff0c;使得编写和运行测试案例变得简单。 Spring Boot测试简介 Spring Boot支持…...

服务器数据恢复—光纤存储FC硬盘数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌光纤存储上共有16块FC硬盘。存储上的卷映射到Linux操作系统上。Linux操作系统上运行Oracle数据库。 服务器存储故障&检测&#xff1a; 存储上2块硬盘故障灯亮起&#xff0c;存储映射到linux操作系统上的卷挂载不上&#xff0c;业…...

Android Binder技术概览

Android中的Binder是一种基于远程过程调用&#xff08;Remote Procedure Call, RPC&#xff09;的轻量级通信机制&#xff0c;核心用于 Android 系统中的进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;。Binder 是 Android 系统中不可或缺的一部分&#…...

09 —— Webpack搭建开发环境

搭建开发环境 —— 使用webpack-dev-server 启动Web服务&#xff0c;自动检测代码变化&#xff0c;有变化后会自动重新打包&#xff0c;热更新到网页&#xff08;代码变化后&#xff0c;直接替换变化的代码&#xff0c;自动更新网页&#xff0c;不用手动刷新网页&#xff09; …...

深度学习模型:卷积神经网络(CNN)

一、前言 CNN 的发展历程可以追溯到 20 世纪 80 年代和 90 年代。受生物视觉系统的启发&#xff0c;研究人员开始探索如何构建专门用于处理图像数据的神经网络。早期的一些研究奠定了基础&#xff0c;例如 Fukushima 提出的 Neocognitron 模型。 随着时间的推移&#xff0c;到…...

Flask 自定义路由转换器

步骤 创建自定义转换器类 继承 werkzeug.routing.BaseConverter。实现 to_python 和&#xff08;可选&#xff09;to_url 方法。 将转换器注册到 Flask 应用 在路由中使用转换器 示例 创建转换器 假设需要自定义一个转换器 FourDigitYearConverter&#xff0c;用于匹配四位年…...

【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方?为什么?

博客主页&#xff1a; [青松] 本文专栏: NLP 大模型百面百过 【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方&#xff1f;为什么&#xff1f; 重要性&#xff1a;★★★ &#x1f4af; 本题主要考察面试者对以下问题的理解&#xff1a; ① 数据特征和模…...

gocv调用opencv添加中文乱码的解决方案

前言 相信很多做视觉的同学在使用opencv给图片添加中文文字的时候会出现这样的乱码显示: 而实际上你期望的是“告警时间:2011-11-11 11:11:11 告警类型:脱岗检测告警 Area:XXXXX Camera:Camera001-001”这样的显示内容,那么这篇文章我将用很简单的方法来解决乱码问题,只需…...

org.apache.log4j的日志记录级别和基础使用Demo

org.apache.log4j的日志记录级别和基础使用Demo&#xff0c;本次案例展示&#xff0c;使用是的maven项目&#xff0c;搭建的一个简单的爬虫案例。里面采用了大家熟悉的日志记录插件&#xff0c;log4j。来自apache公司的开源插件。 package com.qian.test;import org.apache.log…...

IC数字后端实现之大厂IC笔试真题(经典时序计算和时序分析题)

今天小编给大家分享下每年IC秋招春招必考题目——静态时序分析时序分析题。 数字IC后端笔试面试题库 | 经典时序Timing计算题 时序分析题1&#xff1a; 给定如下图所示的timing report&#xff0c;请回答一下几个问题。 1&#xff09;这是一条setup还是hold的timing report?…...

java centos 离线使用sherpa-onnx文字转语音TTS

sherpa-onnx: https://github.com/k2-fsa/sherpa-onnx.git 文档链接;Java API — sherpa 1.3 文档 1. 项目基础介绍和主要编程语言 sherpa-onnx 是一个基于下一代 Kaldi 和 onnxruntime 的开源项目,专注于语音识别、文本转语音、说话人识别和语音活动检测(VAD)等功能。该项…...

Android 11 三方应用监听关机广播ACTION_SHUTDOWN

前言 最近有项目过程中&#xff0c;有做app的同事反馈&#xff0c;三方应用无法监听关机广播。特地研究了下关机广播为啥监听不到。 1.原因&#xff1a;发送关机广播的类是ShutdownThread.java&#xff0c;添加了flag:Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...