1.static_cast
主要使用场合
- 当把一个较大的算术类型转化为一个较小的算术类型时,使用告诉编译器,我们不在乎精度损失,从而关闭编译器的警告
double d = 9.3;
int i = d; //warning:可能丢失数据。有的编译器也不提示。
int i = static_cast<int>(d);//no warning
- 对于编译器无法自动进行的类型转换,eg:
void*
类型指针和普通类型指针的转换。安全由程序员自己保证。
void* p = &d; //由自己保证d是一个double类型的数据,否则产生未定义错误。
char* dp = static_cast<double*>(p);
2.const_cast
主要使用场合
- const_cast只能改变对象的底层const.去除或者加上。
//const int data = 1;
int data = 1;
const int& const_ref = data;
int& not_const_ref = const_cast<int&>(const_ref);
not_const_ref = 2;
cout << data << endl;//2, still 1 while const int data.
cout << const_ref << endl;//2
cout << not_const_ref << endl;//2
主要使用场合为函数重载,例如已经有一个函数,另一个函数依赖它完成。
const string& shorter_string(const string& s1, const string& s2) {
cout << "const" << endl;
return s1.size() < s2.size() ? s1 : s2;
}
string& shorter_string(string& s1, string& s2) {
cout << " not const" << endl;
const string& r = shorter_string(static_cast<const string&>(s1), static_cast<const string&>(s2));
return const_cast<string&>(r);
}
3.reinterpret_cast
1.不相关类型的转换,非常危险;hash函数中可使用。
unsigned short Hash( void *p ) {
unsigned int val = reinterpret_cast<unsigned int>( p );
return ( unsigned short )( val ^ (val >> 16));
}