作者
fengbingchun
责编
屠敏
出品
CSDN博客
ScottMeyers大师Effective三部曲:EffectiveC++、MoreEffectiveC++、EffectiveSTL,这三本书出版已很多年,后来又出版了EffectiveModernC++。
这里是MoreEffectiveC++的笔记:
1.指针与引用的区别
voidprintDouble(constdoublerd){std::coutrd;//不需要测试rd,它肯定指向一个double值}voidprintDouble(constdouble*pd){if(pd){//检查是否为NULLstd::cout*pd;}}inttest_item_1(){char*pc=0;//设置指针为空值charrc=*pc;//让指针指向空值,这是非常有害的,结果将是不确定的//std::stringrs;//错误,引用必须被初始化std::strings(xyzzy);std::stringrs=s;//正确,rs指向sstd::string*ps;//未初始化的指针,合法但危险{std::strings1(Nancy);std::strings2(Clancy);std::stringrs=s1;//rs引用s1std::string*ps=s1;//ps指向s1rs=s2;//rs仍旧引用s1,但是s1的值现在是Clancyps=s2;//ps现在指向s2,s1没有改变}std::vectorintv(10);v[5]=10;//这个被赋值的目标对象就是操作符[]返回的值,如果操作符[]//返回一个指针,那么后一个语句就得这样写:*v[5]=10;return0;}
指针与引用看上去完全不同(指针用操作符”*”和”-”,引用使用操作符”.”),但是它们似乎有相同的功能。指针和引用都是让你间接引用其它对象。
在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。在C++里,引用应被初始化。
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。
当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时(最普通的例子是操作符[]),你不应该使用指针。而在除此之外的其它情况下,则应使用指针。
关于引用的更多介绍参考: