c++中的四种强制类型转换(全)

背景

上次的招银网络科技面试时遇到了这个问题,当时没有答上来,特此在这里搜集资料做一个记录,不断学习进步!

>> static_cast

用法static_cast <类型说明符> (变量或表达式)

1、static_cast用于将一种数据类型强制转换为另一种数据类型,例如将整型数据转换为浮点型数据。

#include<iostream>
using namespace std;

int main()
{
  int a = 3;
  int b = 2;
  //double result = a/b; //note1
  double result = static_cast<double>(a) / static_cast<double>(b); //note2
  cout << result << endl;
}

note1 和note2的结果分别如下:
在这里插入图片描述
2、可以使用static_cast找回存在于void*指针中的值

#include<iostream>
using namespace std;

int main()
{
	double a = 7.00;
	void* b = &a;
	double* b2 = static_cast<double*>(b);
	cout << *b2 << endl;
}

在这里插入图片描述
主要几种用法:

  1. 用于类层次结构中基类和派生类之间指针或引用的转换,进行上行转换(把派生类的指针或引用转换成基类表示)是安全的,进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的;
  2. 用于基本数据类型之间的转换,如把int转换成char。
  3. 把空指针转换成目标类型的空指针
  4. 把任何类型的表达式转换为void类型

注意:static_cast不能转换掉expression的const、volitale或者_unaligned属性。

>> const_cast

在c++编写程序时,如果我们不想某一个数据被更改,这个时候我们会用到const限定符。

const_cast用于强制去掉不能被修改的常数特性,但需要特别注意的是const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性其去除常量性的对象必须为指针或引用。

#include<iostream>
using namespace std;

int main()
{
        double a = 7.00;
        double* b = &a;
        double* b2 = const_cast<double*>(b);
        *b2 = 10.0; //已经可以更改它的值
        cout << *b2 << endl;
}

在这里插入图片描述
用法:const_cast<type_id> (expression)

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。

1、 该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。

2、常量指针被转化成非常量指针,并且仍然指向原来的对象;

3、 常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象

4、 它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一 个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

>> reinterpret_cast

reinterpret_cast主要有三种强制转换用途:改变指针或引用的类型、将指针或引用转换为一个足够长度的整形、将整型转换为指针或引用类型

用法:reinterpret_cast<type_id> (expression)

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。

它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

例如:

int *a = new int;
double *d = reinterpret_cast<double *>(a);

在上例中,将整型指针通过reinterpret_cast强制转换成了双精度浮点型指针。

reinterpret_cast可以将指针或引用转换为一个足够长度的整形,此中的足够长度具体长度需要多少则取决于操作系统,如果是32位的操作系统,就需要4个字节及以上的整型,如果是64位的操作系统则需要8个字节及以上的整型。

在使用reinterpret_cast强制转换过程仅仅只是比特位的拷贝,因此在使用过程中需要特别谨慎!

>> dynamic_cast

用法:dynamic_cast<type_id> (expression)

其他用法:

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

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

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

4、使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过

5、在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

向上转换,即为子类指针指向父类指针(一般不会出问题);向下转换,即将父类指针转化子类指针。
向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。
在C++中,编译期的类型转换有可能会在运行时出现错误,特别是涉及到类对象的指针或引用操作时,更容易产生错误。Dynamic_cast操作符则可以在运行期对可能产生问题的类型转换进行测试。

部分参考自:

文献一
文献二

猜你喜欢

转载自blog.csdn.net/weixin_44378800/article/details/107093118