来源:《C++必知必会》
1,引用。
引用与指针的三大区别:1,不存在空引用;2,所有引用都要初始化;3,一个引用永远指向用来对它初始化的那个对象。
编译器可能无法检测到不那么明显的创建空引用的尝试,如下:
1 Employee *getAnEmployee();2 //......3 Employee &anEmployee = *getAnEmployee();//getAnEmployee可能返回为空指针4 if( &anEmployee == 0){5 //......6 }7 //建议使用指针来存放getAnEmployee函数的返回值
2,我们知道,数组形参会产生所谓的“退化”现象,即退化成指向中其首元素的指针,而且会丢失边界。如以下函数声明:
void average(int ary[]);
其形参仍为一个int *类型。
如果数组边界的精确数值非常重要,并且希望函数只接受含有特定数量的元素的数组,可以考虑使用一个引用形参:
void average (int (&ary)[12]);
这样average函数即只能接受大小为12的整形数组。可通过模板来让编译器帮我们推导数组的大小:
template <int n>void average(int (&ary)[n]);
更传统的做法当然是直接将数组大小以参数的形式传入:
void average_n(int ary[], int size);
多维数组形参的情况类似:
1 void process(int (*ary)[20]);//参数为指向20个元素数组的指针2 void process(int ary[][20]);//与上行等价,但可读性更好
3,注意到引用与指针的第三个区别,所以在实际情况下,通常用引用来代替常量指针的使用:
1 T *pt = new T;2 const T &rct = *pt;3 T &rt = *pt;
4,使用多级指针的一种情况是在函数中修改指针参数的值,如:
1 void scanTo(const char **p, char c){2 while( **p && **p != c)3 ++*p;4 }
这种做法是合理的,但是在C++中,更习惯、更简单、更安全的做法是使用指向指针的引用来作为函数参数,而不是指向指针的指针:
1 void scanTo ( const char *&p, char c){2 while (*p && *p != c)3 ++p;4 }5 6 char s[] = "Hello, China!";7 const char *cp = s;8 scanTo(cp, ",");
5,一个常见的误解是:适用于指针的转换同样适用于指向指针的指针。非也。如下:
1 Circle *c = new Circle;2 Shape *s = c; //挺好的3 Circle **cc = &c;4 Shape **ss = cc; //错误!一个指向Circle指针的指针并不是一个指向Shape指针的指针!
当涉及const时也会发生同样的混淆:
1 char *s1 =0;2 const char *s2 = s1; // no pblm3 char *a[MAX]; // that is, char **4 const char ** ps = a; //Oooooops!
总结:引用比指针安全、优美,能用引用的时候就尽量多用引用吧。
原文链接: https://www.cnblogs.com/cmleung/archive/2011/05/24/2054940.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/26013
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!