天天看点

【C++进阶】类型转换运算符

类型转换运算符

一、旧式转型

#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

执行安全向下转型操作,也就是支持运行时识别指针或所指向的对象,这是唯一一个无法用旧式语法来进行的转型操作。

总结

尽可能避免使用强制转换(显示转换),如果无法避免,推荐使用新式类型转换。

继续阅读