类和对象--中--初始化列表(重要)、隐式类型转化(理解)、最后两个默认成员函数
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作用: 通过特定的值,来初始化对象。 1.2定义: 初始化列表,就相当于定义对象(开空间)。不管写不写初始化列表,每个成员变量都会走一遍初始化列表(开出对应的空间…...

uni-app运行 安卓模拟器 MuMu模拟器
最近公司开发移动端系统,使用真机时每次调试的时候换来换去的麻烦,所以使用模拟器来调试方便。记录一下安装和连接的过程 一、安装MuMu模拟器 百度搜索MuMu模拟器并打开官网或者点这里MuMu模拟器官网 点击下载模拟器 安装模拟器,如果系统…...
java 打印对象所有属性的值 循环
在Java中,如果你想要打印一个对象的所有属性值,可以使用反射(Reflection)来获取对象的所有字段,并循环遍历这些字段以打印它们的值。以下是一个示例代码,展示了如何实现这一点: 示例类 假设我…...
k8s认证、授权
在 Kubernetes 中,kubectl auth can-i 命令用于检查当前用户或指定的 ServiceAccount 是否有权限执行特定的操作: kubectl auth can-i create deployment --as system:serviceaccount:default:dev-sa这个命令的作用是检查名为 dev-sa 的 ServiceAccount…...

基于spring boot的纺织品企业财务管理系统论文
摘 要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对纺织品企业财务信息管理的提升&…...
@RequestBody和前端的关系以及,如何在前后端之间传递数据?
RequestBody 注解在 Spring MVC 中用于将 HTTP 请求体中的数据绑定到控制器方法的参数上。为了更好地理解 RequestBody 和前端之间的关系,我们可以从以下几个方面进行探讨: 1. 请求体的格式 前端发送的请求体通常是一个 JSON 字符串,也可以…...

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

【大数据学习 | Spark-Core】Spark的改变分区的算子
当分区由多变少时,不需要shuffle,也就是父RDD与子RDD之间是窄依赖。 当分区由少变多时,是需要shuffle的。 但极端情况下(1000个分区变成1个分区),这时如果将shuffle设置为false,父子RDD是窄依赖关系&…...
Spring Boot Web应用开发:测试
在Spring Boot中,测试是开发过程的一个重要部分,它确保你的应用按预期工作,并且可以帮助你在早期发现和修复问题。Spring Boot提供了多种便捷的测试工具,使得编写和运行测试案例变得简单。 Spring Boot测试简介 Spring Boot支持…...

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

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

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

深度学习模型:卷积神经网络(CNN)
一、前言 CNN 的发展历程可以追溯到 20 世纪 80 年代和 90 年代。受生物视觉系统的启发,研究人员开始探索如何构建专门用于处理图像数据的神经网络。早期的一些研究奠定了基础,例如 Fukushima 提出的 Neocognitron 模型。 随着时间的推移,到…...
Flask 自定义路由转换器
步骤 创建自定义转换器类 继承 werkzeug.routing.BaseConverter。实现 to_python 和(可选)to_url 方法。 将转换器注册到 Flask 应用 在路由中使用转换器 示例 创建转换器 假设需要自定义一个转换器 FourDigitYearConverter,用于匹配四位年…...

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

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

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

IC数字后端实现之大厂IC笔试真题(经典时序计算和时序分析题)
今天小编给大家分享下每年IC秋招春招必考题目——静态时序分析时序分析题。 数字IC后端笔试面试题库 | 经典时序Timing计算题 时序分析题1: 给定如下图所示的timing report,请回答一下几个问题。 1)这是一条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
前言 最近有项目过程中,有做app的同事反馈,三方应用无法监听关机广播。特地研究了下关机广播为啥监听不到。 1.原因:发送关机广播的类是ShutdownThread.java,添加了flag:Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...