More effective C++:条款1.仔细区别pointers和references及条款2:最好使用C++转型操作符

条款1.仔细区别pointers和references

1.pointers适用*和->操作符,references适用.。
2.没有空引用,references必须有初值。

char *pc = 0;     //定义空指针
char &rc = *pc;   //references代表null pointer的解引值

上面行为的结果是不可预期的,有可能产生任何输出,一定要避免以上行为。
3.由于references有初值,所以使用的时候可以直接使用,但是pointers由于可以为空,所以在使用的时候通常需要判空。
4.pointers可以被重新赋值,也就是指向一块新的地址,新的对象。但是references总是指向最初获得的对象。所以在考虑使用的时候,如果是考虑在不同时间指向不同对象,或者不指向任何对象的时候,可以使用pointers,前者可以改变pointers所指对象,后者可以将pointers设为null。如果想总是指向一个对象,一旦代表该对象就不能改变,应该选用references。
5.使用操作符的时候经常使用的也是references,因为如果采用pointers,比如说一个vector数组,我们对v[5]返回,如果想要使用的时候就应该是*v[5],这样使用的时候总是感觉像个指针数组。所以我们对它返回的时候应该是采用references。

条款2:最好使用C++转型操作符

首先知道,将一个pointer-to-const-object转换为pointer-to-non-const-object(改变对象的常量性),和将一个pointer-to-base-class-object转换为pointer-to-derived-class-object(完全改变对象类型),其差别巨大,传统的C转型动作对此并无区分。所以C++有四个新的转型操作符:static_cast,const_cast,dynamic_const,reinterpret_cast.
而从C转型动作:(type)expression应该改为C++中类似static_cast<type>(expression)的形式。
那么关键就是如何使用C++的四种转型操作符:
1.static_cast
static_cast基本上和C旧式转型相同的威力与意义,以及相同的限制。比如int转为double是可行的,float转int是可行的,struct转int是不可行的,double转为pointer是不可行的。也不能移除表达式的常量性,因为以及有const_cast专门做此类型的转型。(其它新式C++转型操作符适用于更集中的目的)
2.const_cast
可以将一个const指针转型为普通指针,只需type为该指针名称。最常用的用途就是将某个对象的常量性去除掉。
3.dynamic_cast
主要用来执行继承体系中“安全的向下转型或者跨系转型动作”,dynamic_cast用来巡航于继承体系当中。可以将指向基类对象的指针或者引用转型为派生类对象的指针或者引用。如果转型失败,会以null pointer(当转型对象为pointer时)或一个exception(当转型对象是reference)表现出来。dynamic_cast无法应用在缺乏虚函数的类型身上,也不能改变类型的常量性。
4.reinterpret_cast
reinterpret_cast转换结果与编译平台息息相关,所以reinterpret_cast不具移植性。reinterpret_cast最常用的用途是转换“函数指针”类型,假如一个数组存储的都是函数指针,但是要加一个int返回类型的函数指针,是做不到的,函数指针数组里面都是void返回类型的函数指针,故此处可用reinterpret_cast做函数指针的类型转换。但是尽量避免将函数指针转型,因为某些情况下可能会导致不正确的结果。

猜你喜欢

转载自blog.csdn.net/qq_43847153/article/details/127886944
今日推荐