24小时热闻
首页 / 51CTO / 正文

C++的转换手段并与Explicit关键词配合使用

51CTO 2020-11-30 09:39:06

 C++的转换手段并与Explicit关键词配合使用

C中我们会进行各种类型的强制转化,而在C中我们经常可以看到这种转换

 

而C++的类型转化和C差别很多,那么C++里面的类型转化是怎么用的呢。C++除了隐式转换和显示转化,显示转化是我们熟知,有四个显示转化函数:static_cast、dynamic_cast、const_cast、reinterpret_cast,主要运用于继承关系类间的强制转化。

下面我就给大家说道说道。

隐式转化

c++语言不会直接将两个不同类型的值相加,二十先根据类型转化规则设法将运算对象的类型统一后再求值。例如 int value = 3.14 +3;这个程序是可以编译通过的,只不过编译器可能会警告改运算损失了精度。这样的类型转化是自动运行,无需程序员介入,因此,它们被称为隐式转换

何时会发生隐式转化:

在下面的情况中,编译器会自动的转化运算对象的类型:

显示转化

C风格的强制转换(Type Cast)容易理解,不管什么类型的转换都可以使用使用下面的方式

 

当然,C++也是支持C风格的强制转换,但是C风格的强制转换可能带来一些隐患,让一些问题难以察觉.所以C++提供了一组可以用在不同场合的强制转换的函数.

C++提供了四种强制类型转化的函数,分别是:

static_cast,命名上理解是静态类型转换。大部分C实现的转化,用这个函数就可以了。

const_cast,字面上理解就是去const属性。

dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。

reinterpret_cast,仅仅重新解释类型,但没有进行二进制的转换。

static_cast:

任何具有明确定义的类型转化,只要不包含底层const,都可以使用static_cast,举一个例子。

 

static_cast强制转换只会在编译时检查,但没有运行时类型检查来保证转换的安全性。同时,static_cast也不能去掉expression的const、volitale、或者__unaligned属性。

const_cast:

const_cast<>可以实现将const 指针类型转普通指针,const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。如果一个对象本身不是一个常量,使用强制类型转化获得写权限是合法的行为。然而如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的后果。

只有const_cast能改变表达式的常量属性,使用其他形式的命名强制类型转化改变表达式的常量属性都将引发编译器错误。同样的,也不能用const_cast改变表达式的类型:

 

dynamic_cast:

1.其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。

2.不能用于内置的基本数据类型的强制转换。

3.dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

4.使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。可以从父类转基类,但是可能为空

5.在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。

 

reinterpret_cast:

实现指针转整形,整形转指针.reinterpret_cast是强制类型转换符用来处理无关类型转换的,通常为操作数的位模式提供较低层次的重新解释!但是它仅仅是重新解释了给出的对象的比特模型,并没有进行二进制的转换!

它是用在任意的指针之间的转换,引用之间的转换,指针和足够大的int型之间的转换,整数到指针的转换。最普通的用途就是在函数指针类型之间进行转换。

请看一个简单代码

 

explicit关键字(显示的类型转化运算符)

C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。即声明为explicit的构造函数不能在隐式转换中使用。

explicit关键字只能用于类内部的构造函数声明上,而不能用在类外部的函数定义上。现在Things类像这样:

 

下面再看个好一点的例子进行对比一下:

 

再看使用explicit的一个例子:

 

这就是我分享的c++的转化类型方法,其中参考了好多人的文字,此外如果大家有什么更好的思路,也欢迎分享交流哈。

本文转载自微信公众号「羽林君」,可以通过以下二维码关注。转载本文请联系羽林君公众号。

C++的转换手段并与Explicit关键词配合使用

【责任编辑:武晓燕 TEL:(010)68476606】

相关推荐

时讯快报

5.5亿用户的选择

立即打开