More effective C++:条款1.仔细区别pointers和references及条款2:最好使用C++转型操作符
创始人
2024-01-23 05:01:47
0次

条款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(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做函数指针的类型转换。但是尽量避免将函数指针转型,因为某些情况下可能会导致不正确的结果。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...