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 显式完成
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转换的类型,的确如它的功能一样——重新解析,变成新的类型,不能重新转换回原类型结果。