在代码里我们或多或少都会依赖c++的隐式类型转换。
然而不幸的是隐式类型转换也是c++的一大坑点,稍不注意很容易写出各种奇妙的bug。
因此我梳理一遍c++的隐式类型转换
一、什么是隐式类型转换
概念:就是当你只有一个类型T1,但是当前表达式需要类型为T2的值,如果这时候T1自动转换为了T2,那么这就是隐式类型转换。
接下来看两个例子,首先是最常见的混用数值类型:
int a = 0;
long b = a + 1; // int 转换为 long
if(a == b)
{
// 默认的operator==需要a的类型和b相同,因此也发生转换
}
int转成long是向上转换,通常不会有太大问题,而long到int则很可能导致数据丢失,因此要尽量避免后者。
第二个例子是自定义类型到标量类型的转换:
std::shared_ptr<int> ptr = func();
if(ptr) // 这里会从shared_ptr转换成bool
{
// 处理数据
}
因为提供了用户自定义的隐式类型转换规则,所以我们可以很简单地去判断智能指针是否为空。在这里if表达式里需要bool,因此ptr转换为了bool,这又被叫做语境转换。
由此可见隐式类型转换转换可以简化代码的书写。不过简化不是没有代价的,我们细细说来。
二、基础回顾