我是靠谱客的博主 美丽眼睛,最近开发中收集的这篇文章主要介绍More Effective C++(1):pointers和references,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先,我们从pointers(指针)、reference(引用)、casts(类型转换)、arrays(数组)、constructors(构造函数)说起,这些议题,几乎是C++程序最基础的部分,大多数情况都会用到上述所有特性。

首先,今天作为此专题的第一节,我们谈一下pointers和references的区别

想必C/C++的初学者对pointers和references的感觉是既爱又恨的。他们看起来很不一样(pointers使用“*”和“->”操作符,而references则使用“.”)但是它们却似乎做着相同的事情。
第一,你必须认识到,没有所谓的null reference(空引用)。一个reference(引用)必须总代表某个对象。若有一个变量,其目的是用来指向(代表)另一个对象,但是也可能它不指向(代表)任何对象,那么则应该使用pointer(指针),因为你可以将pointer设置为null。换个角度看,若这个变量总是必须代表一个对象,即不允许此变量为空,这时就应考虑使用reference(引用)。

但是,下面这样的东西又是何种意义呢?

char *pc=0;
//将pointer设定为空
char&
rc=*pc;
//让reference代表null pointer的解引值

这种代码是不可接受的。其结果不可预知(C++对此没有定义),编译器可以产生任何可能的输出。所以应当慎重使用pointer和reference。

由于reference必须代表某一个对象,C++因此要求references必须要有初值,否则会编译错误:

string &str;
//错误!!!references必须被初始化
string s("wang");
string &str=s;
//正确,rs执行s

但是pointer就没有这样的限制:

string *str;

没有所谓的null reference这个事实意味着使用references可能会比使用pointers效率更高。因为使用reference之前不需要测试其是否有效。

void printDouble(const double& rd){
cout<<rd;
//无需测试rd,必然代表某一个double
}

若使用pointers,为程序的严谨性和正确性,必须检测其是否为空:

void printDouble(const double *rd){
if(rd){
//检查是否为null pointer(空指针)
cout<<*rd;
}
}

另一个重要的差异就是:pointers可以被重新赋值,指向另外一个对象,references却总是指向(代表)它最初获得的那个对象。

string s1("Nanjing");
string s2("Beijing");
string& rs=s1;
//rs指向(代表)s1
string *ps=s2;
//ps指向s2
rs=s2;
//rs仍然代表s1
但是s1的值现在变成了"Beijing"
ps=&s1;
//ps现在指向s1
s1并未发生变化

通常而言,当考虑“不指向任何对象”的可能性时,或是考虑“在不同时间指向不同对象”的能力时,应该采用pointer。前一种情况你可以将pointer设置为null,后一种情况则可以改变pointer的所指对象。而“总是会代表某个对象”,而且“一旦代表了该对象就不能再改变”,那么这时应该选用reference。

当然,还有一些情况需要使用reference,例如实现某些操作符的时候。最常见的就是operator[ ]。这个操作符很特别地必须返回某种“可以被当作assignment赋值对象”的东西:

vector<int> v(10);
//构造一个int类型的vector,大小为10
v[5]=10;
//assignment的赋值对象是operator[ ]的返回值
如果operator[ ]返回pointer,上边最后一条语句必须是:
*v[5]=10;
但这使得v好似指针形成的vector,事实并非如此。所以,应该总是令operator[ ]返回一个reference。

因此可做如下结论:当需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符而其语法需求无法由pointer完成,应该选用reference。其他的任何时候,都应使用pointers。

最后

以上就是美丽眼睛为你收集整理的More Effective C++(1):pointers和references的全部内容,希望文章能够帮你解决More Effective C++(1):pointers和references所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部