一种 C++ 转换的非正式分类

C++ 正式分类方法是直接按语法分类,分为:隐式转换和显示转换。隐式转换又称为标准转换。显示转换又分为:C 风…

C++ 正式分类方法是直接按语法分类,分为:隐式转换和显示转换。隐式转换又称为标准转换。显示转换又分为:C 风格转换、函数风格转换、C++ 风格转换。C++风格转换就是 static_castdynamic_castconst_castreinterpret_cast 这 4 种。

有很长一段时间我都有这样的疑问:转换前的对象和转换后的对象是不是同一个?

现在,我引入一种非正式分类方法,分为:同对象转换和异对象转换。这两个术语是我自己编的,只是为了方便说明问题。

  • 同对象转换:转换后的对象和转换前的对象是同一个,也就是不会构造一个新的对象,还是使用原来的对象。
  • 异对象转换:转换后的对象和转换前的对象不是同一个,也就是会构造一个新的的对象。

下面分别说明这两种转换的典型情况。

一、同对象转换

所有的值类别转换及其变形都是同对象转换。

C++ 的值类别可以使用 static_cast 进行转换,属于同对象转换。注意:static_cast<T&>()static_cast<T&&>() 的语义不是将一个对象转换为一个引用,而是转换对象的值类别,使其能被对应的引用绑定。

这种情况带有值类别转换,属于同对象转换。

这种情况带有值类别转换,也是同对象转换。注意:通过 const_cast 修改原本为 const 的对象是未定义行为。

二、异对象转换

所有的非值类别转换都是异对象转换。

转换之后,指针本身是异对象,指针所指的对象是同对象。这种情况也包含:借助指针进行 OOP 转换,借助指针进行 const_cast 转换。

本文来自网络,不代表软粉网立场,转载请注明出处:https://www.rfff.net/p/8460.html

作者: HUI

发表评论

您的电子邮箱地址不会被公开。

返回顶部