c++新式转型和旧式转型

这两天上班都不是很忙,就找了一份c++的资料看。

上面提到《Effective C++》一书中有条原则:尽量避免转型、注重效率避免 dynamic_cast、尽量设计成无需转型、可把转型封装成函数、宁可用新式转型,少用旧式转型。

第一次听到新式转型和旧式转型这两个词,就查阅资料学习了一下,现在将它们总结一下。

一、旧式转型是指c语言风格类型的强制转换,有两种,语法如下:
1.(T)expression

	double i = 5.23;
	int a = (int)i;
	cout << a << endl;//输出5

2.T(expression)

	int i = 123456;
	string s = to_string(i);
	cout << s << endl;//输出123456

二、新式类型转换是指c++风格的强制类型转换,有四种,语法如下:

1.const_cast(expression):用于去除对象的const或者volatile属性。

void Func(double& d) { ... }  
void ConstCast()  
{  
   const double pi = 3.14;  
   Func(const_cast<double&>(pi)); 
   //Func函数的参数类型不是const的
   //所以要用const_cast去除 pi的const属性才不会报错
}

2.static_cast(expression):static_cast 作用和C语言风格强制转换的效果基本一样,用于基本数据类型之间的转换,如把int转换成char,double转换成int等。c++ 的任何的隐式转换都是使用 static_cast 来实现。有安全隐患。

	double i = 123.456;
	int a = static_cast<int>(i);
	cout << a << endl;//输出123

3.reinterpret_cast(expression):改变指针或引用的类型、将指针或引用转换为一个足够长度的整形、将整型转换为指针或引用类型。

int *a = new int;
double *d = reinterpret_cast<double *>(a);
//将整型指针通过reinterpret_cast强制转换成了双精度浮点型指针

4.dynamic_cast(expression):一般是用在父类和子类的转换上。其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。不能用于内置的基本数据类型的强制转换。dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值