第五章

5.3.2

只有在必要时才使用后置操作符
         前置操作需要做的工作更少,只需加 1 后返回加 1 后的结果即可。而后置操作符则必须先保存操作数原来的值,以便返回未加 1 之前的值作为操作的结果。 对于更多的复杂迭代器类型,这种额外工作可能会花费更大的代价。

5.11

         一旦删除了指针所指向的对象,立即将指针置为 0,这样就非常清楚地表明指针不再指向任何对象。

5.12.6
const_cast :将转换掉表达式的 const 性质
const int ival=31;
const int *cpi=&ival;
int *pi=const_cast<int *>(cpi);
*pi=4;
cout<<ival<<'\t'<<*pi<<endl;

        此时输出“31    4”,结果并不如我们所想,这是由于IBM中称“*pi=4”为未定义的行为,即在标准C++中未定义,由编译器决定如何处理。可以看出C++里是const,就是const,这也保证了C++的稳定性。

reinterpret_cast:用来处理无关类型之间的转换

        随意在不同类型之间使用reinterpret_cast,也之后造成程序的破坏和不能使用。

typedef int (*FunctionPointer)(int); 
int value = 21; 
FunctionPointer funcP; 
funcP = reinterpret_cast<FunctionPointer> (&value); 
funcP(value);

        这个过程编译器都成功的编译通过,不过一旦运行我们就会得到"EXC_BAD_ACCESS"的运行错误,因为我们通过funcP所指的地址找到的并不是函数入口。

static_cast :编译器隐式执行的任何类型转换都可以由 static_cast 显式完成 
        static_cast和reinterpret_cast一样,两者都不能去除const限定。对于static_cast所需要的关系,"继承"绝对是其中之一,所以static_cast支持指向基类的指针和指向子类指针的相互转换。但 基类到子类的转换,用static_cast并不是安全的(详见下文)。似乎也只有继承关系是可以被static_cast接受的,其他情况的指针和引用转换都会被static_cast直接扔出编译错误,而这层关系上的转换又几乎都可以被dynamic_cast所代替。这样看起来static_cast运算符的作用看起来就太小了。实际上static_cast真正用处并不在指针和引用上,而在基础类型和对象的转换上 。 而 基于基础类型和对象的转换都是其他三个转换运算符所办不到的
float floatValue = 21.7;
int intValue = 7;
cout << floatValue / 7 << "\t\t" << static_cast<int> (floatValue)/7 <<endl;
cout << intValue/3 << "\t\t" << static_cast<double> (intValue)/3 << endl;
dynamic_cast

        static_cast和reinterpret_cast运算符要么直接被编译器拒绝进行转换,要么就一定会得到相应的目标类型的值。 而dynamic_cast却会进行判别,确定源指针所指的内容,是否真的合适被目标指针接受。如果是否定的,那么dynamic_cast则会返回null。

        但dynamic_cast并不是真的允许任意对象指针之间进行转换,最后返回个null值来告知转换无结果。对于继承来说,虚函数是很重要的,这不仅仅是实现多态性的一个重要标志,同时也是dynamic_cast转换能够进行的前提条件。dynamic_cast需要具有多态性的类才能进行转换,如果基类或者子类没有任何虚函数(如果基类有虚函数表,子类当然是自动继承了该表),当他们作为dynamic_cast的源类型进行转换时,编译也会失败。继承不代表有多态性,继承只是多态性的一个前提条件,virtual function是保证多态性的条件。 如果没有virtual,即使是有继承关系的类型之间,也不能使用dynamic_cast进行转换。 VS报出的编译错误很直接的:type is not polymorphic(关于dynamic_cast这篇博文写的挺好的,基本全是参照这篇博文)。

cast back

        reinterpret_cast转换的类型,的确如它的功能一样——重新解析,变成新的类型,不能重新转换回原类型结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值