C/C++编程:隐式转换

隐式转换

凡在语境中使用了某种表达式类型T1,但语境不接受该类型,而接受另一类型T的时候,会进行隐式转换,具体是:

  • 调用以T2为形参声明的函数,以该表达式为实参
  • 运算符期待 T2,而以该表达式为操作数;
  • 初始化 T2 类型的新对象,包括在返回 T2 的函数中的 return 语句
  • 将表达式用于 switch 语句(T2 为整型类型);
  • 将表达式用于 if 语句或循环(T2 为 bool)。

  • 我们来看个例子:混用数值类型的转换
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,这又被叫作语境转换。

仅当存在一个从 T1 到 T2 的无歧义隐式转换序列时,程序良构(能编译)。

如果所调用的函数或运算符存在多个重载,则将T1到每个可用的T2都构造隐式转换序列之后,以重载决议规则决定编译哪个重载

转换序列

  • 当考虑构造函数或用户定义转换函数的实参时,只允许一个标准转换序列(否则将实际上可以将用户定义转换串连起来)

完全理解c++的隐式类型转换

猜你喜欢

转载自blog.csdn.net/zhizhengguan/article/details/114900906