《C++ primer plus》精炼(OOP部分)——对象和类(5)

2023-09-17 10:12:27

“学习是照亮心灵的火炬,它永不熄灭,永不止息。”

类的自动和强制类型转换

原始类型转换为自定义类型

可以用一个参数的构造函数来实现,例如:

class Student{
	string s;
	int grade;
	
	Student(int i);
}

int main(void)
{
	Student s;
	s=11;//隐式调用构造函数来实现类型转换
	s=Student(11);//显式调用构造函数
}

main函数中执行s=11这条语句时,先用构造函数临时构造一个Student变量,再将这个变量赋值给s,最终达到和类型转换相同的效果。
另外,如果声明了explicit关键字,那么不能隐式调用构造函数构造临时变量,只能显式调用:

//两种显式调用构造函数的方法
s=Student(11);
s=(Student)11;

这种转化方式也允许先进行原始类型之间的转换:

//先将double类型的参数转换为int类型,再进行类型转换
s=Student(11.3);
s=(Student)11.3;
s=11.3;

注意,这种构造函数可能引起二义性:

class Student{
	string s;
	int grade;
	
	Student(int i);
	Student(double d);
}

int main(void)
{
	Student s;
	//下面两个函数都会导致二义性
	s=11;
	s=Student(11);
}

在这种情况下,11既可以作为int参数调用构造函数,也可以先转换为double参数,然后调用构造函数。

将自定义类型转换为原始类型

将自定义类型转换为其他类型需要特定的转换函数:

operator typename();

转换函数有以下几个特点:

  • 转换函数必须是类方法
  • 转换函数不能指定返回类型
  • 转换函数不能有参数

例如:

class Student{
	string st;
	int grade;
	
	Student(int i);
	
	operator double();
}

int main(void)
{
	Student s;
	
	s=11;
	s=Student(11);

	double d=s;//调用operator double()函数
}

转换函数也会导致二义性:

class Student{
	string st;
	int grade;
	
	Student(int i);
	
	operator double();
	operator int();
}

int main(void)
{
	Student s;
	
	s=11;
	s=Student(11);

	double d=s;//调用operator double()函数,这样不会导致二义性
	cout<<s;//导致二义性
}

在最后一句中,s既可以转换成double类型,也可以转换成int类型,因此会导致二义性。但是如果进行强制类型转换就不用担心这个问题:

cout<<<(double)s;//不会导致二义性

和构造函数一样,转换函数也可以用explicit关键字来表明必须使用显示类型转换。
请添加图片描述
我是霜_哀,在算法之路上努力前行的一位萌新,感谢你的阅读!如果觉得好的话,可以关注一下,我会在将来带来更多更全面的知识讲解!

更多推荐

使用烧瓶的简单电子商务API

一、说明让我们试一试烧瓶(Flask)这个模型框架,这个应用程序可让您管理和扩展您的云端业务;它允许管理人员浏览和计算商店的总销售额并从在线商店-服装。二、什么是烧瓶?什么是烧瓶?它是一个Web框架-一个极简主义和轻量级的设计,用于在Python中构建Web应用程序。我们将在网上开设一家服装店。以下是我们的架构:实际实

总结:nginx配置

一、nginxrewrite与proxy_pass区别rewrite和proxy_pass都是Nginx的常用指令,但它们的功能和使用场景有所不同。1、rewrite:是一个用来修改请求URI的指令。在Nginx收到一个请求后,rewrite指令可以基于特定的条件改变这个请求的URI,可能是改变文件路径,可能是重定向到

视频如何压缩?视频压缩到100M以内这样做

在日常生活中,我们常常需要处理各种各样的视频文件,但往往视频的大小会给我们的存储和传输带来困扰。那么,如何有效地压缩视频呢?下面就给大家分享三种解决方法,一起来看看吧。方法一:嗨格式压缩大师这是一款功能强大的视频压缩工具,它不仅支持多种格式的视频压缩,还具备高质量的输出效果和极快的压缩速度1、打开嗨格式压缩大师,在几个

成集云 | 金蝶云星空集成聚水潭ERP(金蝶云星空主管供应链)| 解决方案

源系统成集云目标系统方案介绍金蝶云星空是金蝶软件(中国)有限公司研发的新一代战略性企业管理软件,致力于为企业提供端到端的供应链整体解决方案,它可以帮助企业构建敏捷供应链体系,降低供应链成本,提高企业利润。此外,金蝶云星空还可以实现高效组织协作,支持多种模式、多场景、多类别的过程精细化管控,满足企业对库存进行批号、保质期

在 Vue 项目中添加字典翻译工具(二)

封装字段翻译组件,可以格式化字典、枚举、字段优点:使用简单,一次配置多次使用,缓存降低后端请求次数,扩展性强store的fieldFormat.js(这里用的store的modules)exportdefault{namespaced:true,state:{types:{}},mutations:{ADD_TYPE:

Spring Bean循环依赖学习与探究

文章目录原理学习源码溯源本文参考:画图带你彻底弄懂三级缓存和循环依赖的问题Spring三级缓存解决bean循环依赖,为何用三级缓存而非二级_笑矣乎的博客-CSDN博客Spring为何需要三级缓存解决循环依赖,而不是二级缓存?_石杉的架构笔记的博客-CSDN博客原理学习主要的三级缓存工作机理学习参考画图带你彻底弄懂三级缓

php在header增加key,sign,timestamp,实现鉴权

在PHP中,您可以通过在HTTP请求的Header中增加Key、Sign和Timestamp等信息来进行安全性鉴权。以下是一种基本的思路和示例,用于说明如何实现这种鉴权机制:生成Key和Sign:服务端和客户端之间共享一个密钥(Key)。当客户端发起请求时,它需要使用密钥生成一个签名(Sign)。签名可以使用加密算法(

数据库JDBC编程

JDBCJDBC是干啥的呢?简单来说就是用java代码操作数据库各种数据库,在开发的时候,就会提供一组编程接口(API)API:ApplicationProgramInterface简单来说就是有个软件,这个软件给你一些功能,你基于这些功能能对这个软件干啥API往往是以函数,类的形式来提供的,说白了就是这个API在这个

130. 被围绕的区域

130.被围绕的区域题目-中等难度示例1.新建board+bfs2.哈希+bfs题目-中等难度给你一个mxn的矩阵board,由若干字符‘X’和‘O’,找到所有被‘X’围绕的区域,并将这些区域里所有的‘O’用‘X’填充。示例示例1:输入:board=[[“X”,“X”,“X”,“X”],[“X”,“O”,“O”,“X”

WinApp自动化测试之工具的选择

WinApp(WindowsAPP)是运行在Windows操作系统上的应用程序,通常会提供一个可视的界面,用于和用户交互。例如运行在Windows系统上的MicrosoftOffice、PyCharm、VisualStudioCode、Chrome,都属于WinApp。常见的WinApp,其扩展名基本都是*.exe,运

电动车充电桩存在网络安全风险吗?

近年来,随着纯电和混动汽车数量的爆炸式增长,其配套的充电桩的需求也呈直线攀升趋势。不过,这些充电桩可能面临着独特的网络安全风险。只要黑客们掌握了足够的相关信息,他们不但能够远程关闭供电网络,甚至会入侵和篡改汽车的设置。下面,我们将深入讨论此类至关重要的安全问题。为什么电动汽车充电桩会存在网络安全风险?2021年,美国曾

热文推荐