More Effective C++ 条款1 仔细区别pointers和references

1. 初始化的区别:有空指针(NULL),但没有空引用,和const变量一样,引用一旦定义就必须和对象绑定。(当然char* pc=0;char& rc=*pc;也合法但无意义)

由此造成的影响:

1) dynamic_cast,对于指针的down_cast,如果失败就返回空指针,但由于没有"空引用"的说法,所以对于引用的down_cast如果失败会抛出一个bad_cast异常。

2) 由于对于引用的使用不需要测试其有效性,而对于指针的使用往往要测试其是否为空。

2. 赋值的区别:对于指针可以重新赋值,而对于引用,一旦初始化就不能再与其他对象绑定(这一点也与const变量相同)

3. 语法的差别:指针存的是地址,使用时需要解引用;引用则是别名。

4. 总结:“当你知道你需要指向某个东西,而且绝对不会改变指向其他东西,或是当你实现一个操作符而其语法需求无法由pointers达成,你就应该选择references。任何其他时候,请采用pointers。

5. 补充:尽管引用一直被称作是"别名”,但其实引用也是占空间的,这可以通过将一个引用封装在一个类中可以看出(占据4个字节),而直接对引用取址和取大小得到的是被引用对象的地址和大小其实是由于编译器的处理(推测引用其实也是通过指针来实现的,只不过经过一层包装,所以引用和指针都是间接存取)

时间: 2024-10-18 03:55:25

More Effective C++ 条款1 仔细区别pointers和references的相关文章

条款1:仔细区别Pointers和References

指针和引用看起来很不一样,指针使用*和->操作符,引用则使用.操作符,但是它们似乎做的是类似的事情. 首先,需求确认的是,C++用没有空引用(null reference),一个引用必须总代表某个对象,所以既不能指向null,也不能声明变量时不赋初值,也不能在使用过程中改变指向(其实用引用更贴切)值.如果不能满足上述条件,可以考虑使用指针. 使用引用可能比指针更富效率,因为引用不需要检查是否为空的情况. 还有一些情况需要使用引用,例如实现某些操作符的时候.最常见的情况就是[],这个操作符需要返回

条款1. 仔细区别指针和引用

1)        没有NULL的references,因此引用reference被初始化. 2)        pointer可以设为NULL,也可以改变其指向. 3)        当你知道你需要指向某个东西,而且绝不会指向其他东西,或是当你实现一个操作符而其语法需求无法用pointers达成,则使用references,否则,请采用pointers.

More Effective C++ 条款0,1

More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类型来模拟bool类型.这允许参数类型为int和bool的函数重载,但是这样做的缺陷是,对于内置的比较运算符,其仍返回int类型. f(int);f(bool); f(a < b); // 会调用f(int),但其实用户期望调用f(bool). 但是一旦改用支持bool类型的编译器,情况可能会发生改变

Effective C++ 条款四 确定对象被使用前已被初始化

1.对于某些array不保证其内容被初始化,而vector(来自STL)却有此保证. 2.永远在使用对象前初始化.对于无任何成员的内置类型,必须手工完成.      int x = 0;      const int * p = &x; 3.不要混淆赋值与初始化的区别.一般初始化在定义的时候一起进行.而赋值是在定义之后的动作.      比如说在某一个类中的构造函数中,函数的行为都是赋值操作,而非初始化操作.      一般来说,对象的成员变量的初始化动作发生在进入构造函数本体之前.所以,我们一

More Effective C++ 条款35 让自己习惯于标准C++ 语言

(由于本书出版于1996年,因此当时的新特性现在来说可能已经习以为常,但现在重新了解反而会起到了解C++变迁的作用) 1. 1990年后C++的重要改变 1). 增加了新的语言特性:RTTI,namespaces,bool,关键词mutable和explicit,enums作为重载函数之自变量所引发的类型晋升转换,以及"在class 定义区内直接为整数型(intergral) const static class members设定初值"的能力. 2). 扩充了Templates的特性

effective c++ 条款4 make sure that objects are initialized before they are used

1 c++ 类的数据成员的初始化发生在构造函数前 class InitialData { public: int data1; int data2; InitialData(int a, int b) { data1 = a: //this is assignment data2 = b; //this is assignment } /* InitialData(int a, int b):data1(a),data2(b) //this is initial {} */ } 2 不同cpp文

More Effective C++ 条款34 如何在一个程序中结合C++和C

1. C++和C混合使用的前提之一就是编译器产生兼容的目标文件(.lib和.dll等).所谓"兼容",指的是编译器在"预编译器相依的特性上"一致,如int和double大小,参数压栈机制等,只有在这个基础上才能讨论结合使用C++和C模块的问题. 2. 在1的基础上,要结合使用C++和C的模块,主要有以下几点需要注意: 1). name mangling(名称重整) Name mangling是C++用于支持函数重载的机制,它对重载的函数名称进行一定改变,使得每个函数

Effective C++ 条款3 尽可能用const

1. const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数本体.用const修饰指针,如果const出现在*之前,表明指针不能更改所指向的对象的内容,如果const出现在*之后,表明指针只能指向同一块内存.另外int const*p和const int*p含义相同.如果对象成员有普通指针,那么构造该类的一个const对象时,const修饰使得该指针只能指向同一块内存,但指针指向的内容可以改变. 2. 将某些东西声明为const可以帮助编译器侦测出错误用法. 3. 编译器强制实

effective c++ 条款13 use object to manage resources.

请求的系统资源需要最终还回系统,为了避免遗忘返还这个动作,可以利用析构函数在object销毁时自动调用的特点来实现. 简单说就是用object来管理资源. 以内存资源为例 class Investment {}; Investment* creatInvestment(){...} // factory function to produce investment object void main() { Investment* pInv = creatInvestment();//call t