C++11/14/17标准
一、强制转换
C风格的强制类型转换很简单,均用 Type b = (Type)a 形式转换。但是C风格的类型转换有不少的缺点:万物皆可转,不容易区分;不容易查找代码。
因此C++给我们提供了4种类型转换操作符来应对不同场合。
类型转换操作符 | 作用 |
---|---|
static_cast | 静态类型转换(在编译期),编译器做类型检查,基本类型能转换,指针不能 |
reinterpret_cast | 重新解释类型 |
const_cast | 去const属性 |
dynamic_cast | 动态类型转换(运行时),运行时检查类型安全(转换失败返回nullptr)如子类和父类之间的多态类型转换(区分对象) |
1、staitc_cast 类似C风格的强制转换,进行无条件转换,静态类型转换
-
基本数据类型转换,enum,struct,int,char,float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。
-
不能用于两个不相关类型的转换,如int和int*之间的转换,虽然二者都是四个字节,但他们一个表示数据,一个表示地址,类型不相关,无法进行转换。
- 可以用于void*和其他指针类型之间的转换(但是不能用于非void指针之间的转换)
若要指针转换可以用reinterpret_cast
代码
int main()
{
int a = 66;
char p = static_cast<char>(a);
cout << p << endl;
int* p;
//message: 与指向的类型无关;
//强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
//char* c = static_cast<char*>(p);
int a = 9;
int* p=&a;
//void* c = static_cast<void*>(p);
//指针只能由void*到其他指针,或者其他指针到Void*
char* x = static_cast<char*>(c);
//int* pa = nullptr;
//int i = static_cast<int>(pa);
//error“static_cast”: 无法从“int *”转换为“int”
while (1);
return 0;
}
2、reinterpret_cast转换的类型必须是一个指针
- 不同类型指针之间的转换
- int转为指针,指针转为int
3、const_cast 可以去掉常量的const属性
虽然可以去除常属性,但是还是改变不了本身
<>内是引用
const int a = 19;
int b = const_cast<int