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

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

文章目录

类的自动和强制类型转换

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

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

cpp 复制代码
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关键字,那么不能隐式调用构造函数构造临时变量,只能显式调用:

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

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

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

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

cpp 复制代码
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();

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

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

例如:

cpp 复制代码
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()函数
}

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

cpp 复制代码
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类型,因此会导致二义性。但是如果进行强制类型转换就不用担心这个问题:

cpp 复制代码
cout<<<(double)s;//不会导致二义性

和构造函数一样,转换函数也可以用explicit关键字来表明必须使用显示类型转换。

我是霜_哀,在算法之路上努力前行的一位萌新,感谢你的阅读!如果觉得好的话,可以关注一下,我会在将来带来更多更全面的知识讲解!

相关推荐
一只旭宝4 分钟前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
Lhan.zzZ2 小时前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio
zh路西法4 小时前
【3D SLAM源码解读系列】(二)Small_gicp——5 个积木搭出最优点云配准
c++·pcl·icp·fastgicp·smallgicp·gicp
fpcc6 小时前
ubuntu26环境下的开发环境安装处理
c++·并行编程
charlie1145141917 小时前
Cinux · 第一次跳进 Ring 3:用户态与特权隔离
开发语言·c++·操作系统·开源项目
别动我齐刘海7 小时前
机器学习基础2——C++、OpenCV、点云、Open3D
c++·人工智能·opencv·机器学习·计算机视觉·机器人·ros2
躺不平的理查德8 小时前
Windows C++ 第三方库使用流程备忘录--OpenCV
开发语言·c++
余额瞒着我当琳8 小时前
C++STL容器string--迭代器,string的接口,string的遍历,访问方式
c++
郭涤生8 小时前
rootfs 详解与裁剪优化记录
linux·c++·bsp
MC皮蛋侠客8 小时前
TDengine C++ 系列(6):高性能写入——参数绑定、批量与 Schemaless
c++·php·tdengine