【C++】类和对象(五)隐式类型转换

文章目录

  • 一、再谈构造函数
    • 构造函数体赋值
    • 初始化列表
      • 初始化列表的语法
      • 必须放在初始化列表的成员
      • 注意:
    • explict关键字的使用
      • 单参数构造函数支持隐式类型的转换
      • 多参数构造函数支持隐式类型的转换
      • 缺省值 的 形式 总结
      • 一个题目

一、再谈构造函数

构造函数体赋值

在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化, 构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体 内可以多次赋值。而真正的初始化可以使用初始化列表

初始化列表

01_31 01 44 55

初始化列表的语法

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

#include<iostream>
using namespace std;
class Date
{
public:// 初始化列表Date(int year, int month, int day): _year(year), _month(month), _day(day){}// 初始化列表是每个成员变量定义初始化的位置Date(int year, int month, int day){// 赋值修改_year = year;_month = month;_day = day;}private:// 声明int _year ; int _month ;int _day;
};int main()
{// 对象实例化Date d1(2024, 1, 31);return 0;
}

必须放在初始化列表的成员

类中包含以下成员,必须放在初始化列表位置进行初始化:

✅ 引用成员变量​

✅ const成员变量

✅自定义类型成员(且该类没有默认构造函数时)

🌰必须在初始化列表位置的例子:

#include<iostream>
using namespace std;
class A
{
public:A(int a = 0):_a(a){cout << "A(int a = 0)" << endl;}
private:int _a;
};
class Date
{
public:// 初始化列表是对每个定义的成员变量 进行初始化Date(int year, int month, int day,int& x):_year(year),_month(month),_day(day),_n(1),_ref(x)//,_aa(1)//如果不在初始化列表对自定义类型进行初始化,编译器会调自定义类型的默认构造如果该自定义类型,不存在自身的的构造函数就会报错 //在自定义类型不提供默认构造的情况下,就必须在初始化列表位置进行初始化,_aa(1){}
private:// 声明int _year ; int _month ;int _day;//注意 const修饰的成员变量,必须放在初始化列表位置进行初始化const int _n;//引用类型变量,必须放在初始化列表位置进行初始化int& _ref;//自定义类型,必须放在初始化列表位置进行初始化A _aa;
};int main()
{// 对象实例化Date d1(2024, 1, 31);return 0;
}

注意:

1.一个变量只能初始化一次

2.尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使 用初始化列表初始化

#include<iostream>
using namespace std;
class Date
{
public:Date(int year, int month, int day)_year = year;_month = month;_day = day;n(1){}private:int _year ; int _month ;int _day;const int _n;
};int main()
{Date d1(2024, 1, 31);return 0;
}

explict关键字的使用

单参数构造函数支持隐式类型的转换

class C
{
public:C(int x = 0):_x(x){}
private:int _x;
};
//C xx(1);//全局对象
class B
{
private:// 缺省值int a = 1;int* p1 = nullptr;int* p2 = (int*)malloc(4);//C cc1 = xx;  // 自定义类型成员只能借用全局对象赋初值,虽然可以,但是很费劲C cc2 = 2;//由于单参数构造函数支持隐式类型的转换,这里就可以用内置类型对自定义类型赋初值
};
int main()
{C cc1(1);//单参数构造函数支持隐式类型的转换(内置类型int 转 自定义类型C)C cc2 = 2;//本质:2构造出一个C的临时对象 再拷贝构造 ->编译器优化了,同一个表达式连续步骤的构造,一般被编译器合二为一//C& cc3 = 2;int i = 1;//double& d = i;//这两句被注释的代码会报错,因为类型转换会产生临时变量 临时变量就具有常性 所以需要加上 const 修饰const C& cc3 = 2;const double& d = i;//cc3、d都引用的是临时变量return 0;
}

如果不想隐式类型的转换发生,那么该场景下,就可以使用explicit关键字,加在构造函数函数前面。

现在来考虑多参数的情况:01_31 03 00 26

多参数构造函数支持隐式类型的转换

class A
{
public://explicit A(int a1, int a2) 不想支持隐式转换,可以加上关键字explicitA(int a1, int a2):_a1(a1),_a2(a2){}private:int _a1;int _a2;
};int main()
{// C++11A aa1 = { 1, 2 };const A& aa2 = { 1, 2 };return 0;
}

缺省值 的 形式 总结

class B
{
private://缺省值 的 形式 总结int _a = 1;int* p = (int*)malloc(4);A aa1 = {1,2};
}
int main()
{return 0}

一个题目

class A
{
public:A(int a):_a1(a), _a2(_a1){}void Print() {cout << _a1 << " " << _a2 << endl;}
private:int _a2;int _a1;
};int main() {A aa(1);aa.Print();
}A.输出1  1
B.程序崩溃
C.编译不通过
D.输出1  随机值

答案:🐶

原因:成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关

建议:声明次序和初始化列表中的次序尽量保持一致。

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

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

相关文章

如何解决Java中的ClassCastException异常

如何解决Java中的ClassCastException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在Java开发中&#xff0c;ClassCastException异常是一个常…

Java高级重点知识点-14-Set接口、HashSet底层原理讲解

文章目录 Set接口 (HashSet 、LinkedHashSet)HashSet底层原理(重点理解) Set接口 (HashSet 、LinkedHashSet) 无序不重复 HashSet集合 HashSet 是根据对象的哈希值来确定元素在集合中的存储位置&#xff0c;因此具有良好的存取和查找性能。 public class HashSetDemo {publ…

新型防勒索病毒方案分享无需依靠病毒库

MCK具备可信系统&#xff0c;数据库保护&#xff0c;场景白名单&#xff0c;文件保护四大功能。如何运用在防勒索病毒中 在防勒索病毒的问题上&#xff0c;MCK主机的加固功能显得尤为重要。MCK的四大功能——可信系统、数据库保护、场景白名单以及文件保护&#xff0c;为我们在…

Excel 快速查询工具 2023.7.1 更新

Excel 快速查询工具作者表示这个软件是因为有时候需要在 Excel 和网站之间进行切换非常的麻烦&#xff0c;这款软件可以以半透明的方框位于桌面上。 特点 软件窗口半透明并至于顶部&#xff0c;无需来回切换界面。 实时查询&#xff0c;不用点击查询或者按回车之类的&#x…

IDEA 学习之 启动“卡死”

目录 1. 断点问题2. IDEA 版本问题 1. 断点问题 部分断点涉及应用启动&#xff0c;会导致启动“卡死” 2. IDEA 版本问题 部分 IDEA 版本存在启动问题&#xff0c;本人之前遇到过&#xff08;别人启动三分钟&#xff0c;我启动半个小时&#xff09;。更换别的版本&#xff…

文本和二进制混合存储

要想让文本和二进制混合存储&#xff0c;有两套方案&#xff1a; ①以文本为主&#xff0c;插入二进制数据 ②以二进制为主&#xff0c;区分文本和二进制数据段 第一套方案的例子&#xff1a; 时间戳[....]&#xff0c;这是一段64位二进制数据。 在这句话中&#xff0c;以二进制…

k8s强制删除一个 Pod

在Kubernetes&#xff08;K8s&#xff09;中强制删除一个Pod&#xff0c;通常是因为Pod处于错误状态或无法正常终止。以下是强制删除Pod的步骤和相关信息&#xff1a; ### 步骤一&#xff1a;获取Pod的名称 首先&#xff0c;你需要知道要删除的Pod的名称。可以使用kubectl get …

AI绘画工具的计算资源需求:深度解析与优化策略

引言 随着人工智能技术的飞速发展&#xff0c;AI绘画工具已经成为艺术创作和设计领域的新宠。这些工具利用深度学习算法&#xff0c;尤其是生成对抗网络&#xff08;GANs&#xff09;和变分自编码器&#xff08;VAEs&#xff09;&#xff0c;能够根据用户的指令或草图生成逼真…

Scala语言基础及进阶

Scala语言基础及进阶 1. 简介 Scala 是一种多范式的编程语言&#xff0c;融合了面向对象编程和函数式编程的特性。它运行在 JVM 上&#xff0c;并且与 Java 互操作性良好。Scala 由 Martin Odersky 于 2003 年设计并实现&#xff0c;目的是解决 Java 语言的一些局限性&#x…

docker技术的说明

根据学习网站整理&#xff1a;Docker 10分钟快速入门_哔哩哔哩_bilibili 小白也能看懂的容器科普说明_哔哩哔哩_bilibili 1.虚拟机&#xff0c;需要模拟硬件系统、运行整个操作系统&#xff0c;但体积臃肿&#xff0c;内存占用较高&#xff0c;程序的性能也会受到影响。 2.…

ubuntu离线安装docker导入镜像

docker安装包 准备工作 1.准备一个docker.service文件 内容如下&#xff1a; [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target[Service] Typenoti…

2024年全国VUE考试中心大全!

大家好&#xff0c;华为HCIA、HCIP、HCIE的笔试部分&#xff0c;都需要在VUE考试中心进行预约。但是很多同学都不知道当地VUE考试中心在哪里&#xff01; 为了解决大家的问题&#xff0c;这边整理了全国各大城市的VUE考试中心名称和详细地址。需要的小伙伴们可以来看看&#x…

JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

韩sir Cookie技术Cookie简单示意图Cookie常用方法Cookie创建Cookie读取JSESSIONID读取指定Cookie Cookie修改Cookie生命周期Cookie的有效路径Cookie作业布置Cookie注意事项Cookie中文乱码问题 Session技术Session原理示意图Session常用方法Session底层机制Session生命周期Sessi…

开源模型应用落地-LangChain高阶-LCEL-表达式语言(八)

一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么? LCEL是一种非常灵活和强大的语言,可以帮助您更…

网络自动化的未来:NMP在设备管理中的实现与应用

随着网络规模的不断扩大和复杂性增加&#xff0c;传统的手动网络管理方法已经无法满足现代IT环境的需求。网络管理平台&#xff08;NMP&#xff09;的出现&#xff0c;为网络设备的自动化管理提供了有效的解决方案。本文将探讨NMP如何实现网络设备的自动化管理&#xff0c;以及…

FuTalk设计周刊-Vol.062

#AI漫谈 热点捕手 1.阿里云推出首个AI程序员&#xff1a;分钟级完成应用开发 在阿里云上海 AI 峰会上&#xff0c;阿里云推出了首个「AI 程序员」&#xff0c;其具备架构师、开发工程师、测试工程师等岗位技能&#xff0c;能完成任务分解、代码编写、测试、问题修复、代码提交…

react学习——14react生命周期图(旧)

1、生命周期图 2、单个组件 class Demo extends React.Component{//构造器constructor(props){console.log("count--constructor")super(props)this.state{count: 1}}//组件将要挂载componentWillMount(){console.log("count--componentWillMount")}//组件…

【AI大模型】ChatTTS——颠覆传统,赋能未来的文本到语音技术

文章目录 一、项目介绍二、代码解释三、从技术角度进行分析四、技术细节与实现五、优缺点分析六、应用场景分析七、未来展望八、结论 一、项目介绍 随着人工智能技术的不断进步&#xff0c;语音合成&#xff08;TTS&#xff09;技术得到了飞速发展。ChatTTS项目作为一个开源的…

用VScode打开keil下的文件中文编码乱码的问题,以及利用VScode转换字符编码的方法

目录 问题描述 解决方法 利用VScode转换字符编码的方法 问题描述 keil中默认的编码是ANIS如下图所示。 而VScode中默认的编码为UTF-8 &#xff0c;打开后如下。 解决方法 建议另存后&#xff0c;再打开目标文件&#xff0c;防止误操作&#xff01; 在VScode的最下方可以找…

MCP2515汽车CAN总线支持SPI接口的控制器芯片替代型号DPC15

器件概述 DPC15是一款独立CAN控制器&#xff0c;可简化需要与CAN总线连接的应用。可以完全替代兼容MCP2515 图 1-1 简要显示了 DPC15 的结构框图。该器件主要由三个部分组成&#xff1a; 1. CAN 模块&#xff0c;包括 CAN 协议引擎、验收滤波寄存 器、验收屏蔽寄存器、发送和接…