语法:const_name<type>(expr);
1、const_cast
去除表达式的const/volatile属性。一般用于去除指针的const属性。
例如:
const int a = 5;
const int * ptr = &a;
int * ptr1 = const_cast<int *>(ptr); // okay!!
*ptr1 = 8;
cout << *ptr1 << endl;
cout << *ptr << endl;
int b = const_cast<int>(a); //error C2440: 'const_cast' : cannot convert from 'const int' to 'int'
cout << b << endl;
}
2、static_cast
标准转换基本上都可以用static_cast来实现。具体有如下用法:
a、将编译器执行的隐式转换显示化;
b、或将void*转换为显式类型的指针;
c、将算术值转换为枚举值;
d、将基类(或基类指针/引用)转化为派生类(或派生类指针/引用)
其中,b、c、d存在潜在的危险;a存在潜在的数据损失。
3、reinterpret_cast
对操作数进行低级别的bit模式的重翻译,其正确性完全由编程者掌控,编译器不负任何责任。
推荐使用reinterpret_cast来实现所有指针的显示转换操作。
4、旧风格的显示转换语法:
a、C++函数风格:type_name(expr)
b、C语言风格:(type_name)expr
旧的显示转换风格,可以实现所有上述三种显示转换方式的功能。但由于其潜在的危险更难于跟踪,因此不推荐使用。
5、dynamic_cast
************************ 三、自定义类型转换 **************************
自定义的类型转换有两种,一种是通过"类型转换函数" (
hi.baidu.com/cosmicocean/blog/item/4b5e47af46f678fdfaed5038.html)
另一种是通过" 单参数的构造函数" 。
实际程序中,用户可以显示的指明某一个转换所采用的类型转换方式,若编译器允许这种转换(内置允许或用户自定义了该转换方式),则进行转换操作。用户没有显示指明时,编译器将根据的情况选择是否能进行隐式转换。下面阐述隐式转换相关的内容:
实际程序中,原类型需要转换为目标类型时,
若有内置转换(lval->rval / promotion / standard conversion)则直接转换;
否则,若类型转换函数转换的类型就是目标类型,则编译器会隐式的调用该函数进行转换;
否则,编译器将结合用户自定义转换与标准转换序列,以达到目标类型。
最后一种情况实际上是如下形式的转换序列:
Standard Conversion Sequence ->User-defined Conversion ->Standard Conversion Sequence
(注意,
序列中只能包含一个用户自定义的转换)
有时候,可以有不同的转换序列能实现原类型到目标类型的转换,编译器需要挑选出最好的一个序列进行隐式类型转换。
1、类型转换函数
含有类型转换函数的转换序列为:User-defined Conversion->Standard Conversion Sequence。
2、构造函数
含有构造函数的转换序列为:Standard Conversion Sequence->User-defined Conversion.
3、最佳选择
不论含有上述哪种用户自定义的转换,若有多个序列可以完成转换,标准转换序列的等级将决定选择那种转换;若几个序列优先级相同,则该转换为ambiguous,编译器无法完成转换。