C++:类型转换
一、静态类型转换(static_cast)
主要用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换
语法:static_cast<target_type>(source object)
1、支持内置数值类型间的转换
#include <iostream>
using namespace std;
int main()
{
char a = 'a';
double b = (double) a;
// 支持内置数值类型间的转换
// 语法:static_cast<target_type>(source object)
double c = static_cast<double>(a);
cout<<b<<endl;
cout<<c<<endl;
return 0;
}
2、支持继承类中父子指针或引用间相互转换.
3、无继承关系的类之间不支持转换
#include <iostream>
using namespace std;
class Base{};
class Son: public Base{};
class Other{};
int main()
{
Base* base = NULL;
Son* son = NULL;
Other* other = NULL;
// a、父转子 向下类型转换,static_cast 支持,但不安全
son = static_cast<Son>(base);
// b、子转父 向上类型转换,static_cast 支持,安全
base = static_cast<Base>(son);
// c、无继承关系的类之间不可以转换
// son = static_cast<Son> other;
return 0;
}
二、动态类型转换(dynamic_cast)
主要用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换
语法:dynamic_cast<target_type>(source object)
1、不支持内置数值类型间的转换
#include <iostream>
using namespace std;
int main()
{
char a = 'a';
// 不支持内置数值类型间的转换
// double c = dynamic_cast<double>(a);
return 0;
}
2、支持继承类中父子指针或引用间相互转换.
3、若存在潜在数据丢失,转换均不允许,因此比静态类型转换更安全。
#include <iostream>
using namespace std;
class Base{};
class Son: public Base{};
class Other{};
int main()
{
Base* base = NULL;
Son* son = NULL;
//1、将base转为Son* 父转子,向下转换,不安全。
//2、若发生了多态,转换总是安全的,转换成功;否则不支持向下转换
//son = dynamic_cast<Son*>(base); // 转换不成功
//3、将son转为Base* 子转父,向上转换,安全。
base = dynamic_cast<Base*>(son); // 转换成功
//4、将son转换为Other*
// Other* other = dynamic_cast<Other*>(son); // 转换不成功
return 0;
}
三、常量转换(const_cast)
该运算符主要用来修改类型的const属性
语法:const_cast<target_type>(source object)
1、常量指针转换为非常量指针,并且仍指向原对象;
2、常量引用转换为非常量引用,并且仍指向原对象;
3、注意:不能直接对非指针和非引用的变量使用const_cast操作符去直接移除其const 属性。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main()
{
int* var01 = NULL;
// 1、将非常量指针转换为常量指针
const int* var02 = const_cast<const int*>(var01);
// 2、将常量指针转换为非常量指针
int* var03 = const_cast<int*>(var02)
// 3、不可对非指针和非引用变量进行const_cast转换
int a = 10;
// const int b = const_cast<const int>(a);
int& var04 = a;
// 4、将非常量引用转换为常量引用
const int& var05 = const_cast<const int&>(var04);
// 5、将常量引用转换为非常量引用
int& var06 = const_cast<int&>(var05);
system("pause");
return 0;
}
四、重新解释转换(reinterpret_cast)
主要用于将一种数据类型从一种类型转换为另一种类型。可将一个指针转换为一个整数,亦可将一个整数转换为一个指针
语法:reinterpret_cast<target_type>(source object)
该类型转换极不安全,不推荐使用