MoreEffectiveC++:类型转换

MoreEffectiveC++:类型转换,第1张

MoreEffectiveC++:类型转换,第2张

仔细想想卑微的类型转换函数(cast),它在编程中的地位就像goto语句一样可鄙。但也不是不能忍,因为在某些紧要关头需要类型转换的时候,这是必须的。

但是,C风格的类型转换并不代表所有的类型转换函数。首先,它们太粗鲁了,可以让你在任何类型之间转换。但是,如果需要更精确的类型转换,这将是一个优势。这些类型的转换有很大的区别,比如把指向const-object的指针转换成指向non-const-object的指针(即只去掉cosnt的类型转换),把指向基类的指针转换成指向子类的指针(即完全改变对象类型)。传统的C风格类型转换不区分上述两种转换。(这一点都不奇怪,因为C风格的类型转换是为C语言设计的,不是为C++设计的)。

第二,C风格的类型转换在程序语句中很难识别。从语法上来说,类型转换由括号和标识符组成,它们可以在C++的任何地方使用。这就很难回答关于类型转换最基本的问题“这个程序中使用类型转换了吗?”。这是因为人类阅读很可能忽略了类型转换的语句,grep之类的工具无法从语句的构成中区分出来。

++C通过引入四个新的类型转换运算符克服了C风格类型转换的缺点:static _ cast、const _ cast、dynamic _ cast和reintERPret_cast。大多数情况下,关于这些运算符,你需要知道的只是,你以前写的是(type) expression,现在应该一直写:static _ cast(expression);例如,假设您要将int转换为double,这样包含int变量的表达式就可以产生浮点值。如果使用C风格的类型转换,可以这样写:

int firstNumber,secondNumber
...
double result =((double)first number)/second number;

如果使用上面的新类型转换方法,应该这样写:

double result = static _ cast(first number)/second number;

这种类型转换对于人和程序来说都很容易识别。

Static_cast基本上和C风格的类型转换功能一样强大,意思一样。它也有功能限制。比如不能像C风格的类型转换一样,用static_cast把struct转换成int类型或者double类型转换成指针类型。另外,static_cast不能从表达式中移除const属性,因为另一个新的类型转换运算符const_cast有这个功能。

在需要更多限制的地方使用其他C++类型转换运算符。Const_cast用于对表达式的Const或volatileness属性进行类型转换。通过使用const_cast,你向人们和编译器强调,你想通过类型转换做的只是改变某些东西的恒定性或易变性。这个意义受到编译器的约束。如果您试图使用const_cast来完成除修改恒定性或易变属性之外的事情,您的类型转换将被拒绝。以下是一些例子:

类小部件{...};
class SpecialWidget:公共小部件{...};
void update(special widget * PSW);
SpecialWidget软件;// sw是非常量对象。
const special widget & CSW = SW;// csw是sw的引用
//是const对象
update(& CSW);//错误!不能将const SpecialWidget*变量
/传递给处理SpecialWidget*类型变量的函数
update(const _ cast(& CSW));
//正确,csw的const是显式转换的(
/Csw和sw可以在update
/function中更新)
update((特殊widget *)& CSW);
//同上,但带有更难识别的C风格类型转换
/
widget * pw = newspecialwidget;
更新(pw);//错误!pw的类型是Widget*,但是
// update函数处理special Widget * type
update(const _ cast(pw));
//错误!Const_cast只能用在影响
//恒定性或易变性的地方。,
//不能用于到继承的子类的类型转换。

到目前为止,const_cast最常见的用法是转换对象的const属性。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » MoreEffectiveC++:类型转换

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情