类型转换运算符
一、旧式转型
#include <iostream>
using namespace std;
int main() {
int i = 4;
double d1 = double(i);
double d2 = (double)i;
cout<<d1<<" "<<d2<<endl;
double d = 3.14;
int i1 = int(d);
int i2 = (int)d;
cout<<i1<<" "<<i2<<endl;
return 0;
}
二、新式转型
1.const_cast
用来移除对象的常量性(cast away the constness),一般用于指针或者引用,使用const_cast去除const限定的目的不是 为了修改它的内容,通常是为了函数能够接受这个实际参数。
#include <iostream>
using namespace std;
void fun(int &val){
cout<<"fun "<<val<<endl;
}
int main() {
const int val = 100;
//int n = const_cast<int>(val); const_cast不能用于对象
//int*p = &val; 无法从const int*转换为int*
int* p = const_cast<int*>(&val);
*p = 200;//不能对val进行更改 是对临时对象进行的操作
cout<<val<<endl;
const int val2 = 200;
int& refval2 = const_cast<int&>(val2);
refval2 = 300;//不能对val2进行更改 同样是对临时对象进行的操作
cout<<refval2<<endl;
fun(const_cast<int&>(val2));
return 0;
}
2.static_cast
编译器隐式执行的任何类型转换都可以由static_cast完成。隐式转换指编译器可以自动完成的(比如将精度低的转换为精度高的)。当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换。static_cast可以将void*指针转换为某一类型的指针,也可以将基类指针指向派生类指针。但无法将const转化为nonconst,这个只有const_cast才可以办得到。
#include <iostream>
using namespace std;
int main() {
int n = static_cast<int>(3.14);//将double转换为int
cout<<n<<endl;
void* p = &n;
int* p2 = static_cast<int*>(p);//将void*转化为int*
return 0;
}
3.reinterpret_cast
reinterpret_cast通常为操作数的位模式提供较低层的重新解释。也就是说将数据以二进制存在形式的重新解释。
#include <iostream>
using namespace std;
int main() {
long long i;
char *p = "This is a example";
i = reinterpret_cast<long long>(p);
//此时结果,i与p值完全相同
int* ip;
char* pc = reinterpret_cast<char*>(ip);
//程序员需要记得pc所指向的真实对象是int型,并非字符串
//如果将pc当作字符指针进行操作,可能会造成运行时错误
//如int len = strlen(pc);
return 0;
}
4.dynamic_cast
执行安全向下转型操作,也就是支持运行时识别指针或所指向的对象,这是唯一一个无法用旧式语法来进行的转型操作。
总结
尽可能避免使用强制转换(显示转换),如果无法避免,推荐使用新式类型转换。