C++中指针和引用的区别(1)---《More Effective C++》

来源:互联网 发布:wifi连接上没有网络 编辑:程序博客网 时间:2024/06/05 23:07

指针和引用看上去有很大差异,指针运算符使用”*”和”->”,引用操作符使用”&”,但是它们似乎有相同的功能。指针和引用都是让你间接引用其他对象。现在我们主要分析一下指针和引用的差异:
1)指针可以指向空值,但是在任何情况下,引用都不能指向空值:
不存在指向空值的引用这个事实使得使用引用的效率比使用指针的效率要高。因为在使用引用之前不需要检查它的合法性:

void printDouble(const double& rd){    cout<<rd<<endl;//不需要测试,肯定不是空值}void print Double(const double* pd){    if(pd){//检查指针是否为空,降低执行效率        cout<<*pd<<endl;    }}

2)指针可以不用初始化,引用则必须要初始化:

string* ps;//正确,虽然不安全,但是合法string& rs;//错误,引用必须被初始化,

3)指针可以被重新赋值,引用则总是指向在初始化化时候被指定的的对象,以后则无法改变:

string s1("Nancy");string s2("Clancy");string& rs=s1;//rs引用s1string* ps=&s1;//ps指向s1rs=s2;//rs仍旧执行那个s1,但是s1的值现在是"Clancy"ps=&s2;//ps现在指向s2,s1没有改变

如果我们对上面的这种代码表示不怎么理解的话,可以先看看如下代码:

#include <iostream>#include <string>using namespace std;int main(){    string s1 = "Hello";    string s2 = "Nancy";    string& s = s1;    string* ptr = &s;    string* ptr1 = &s1;    string* ptr2 = &s2;    cout << "s1的内存地址:"<< ptr1 << endl;    cout << "s2的内存地址:" << ptr2 << endl;    cout << "s引用的内存地址:" << ptr << endl;    cout << "s修改内部值操作:" << endl;    s = s2;    cout << s << endl;    cout << s1 << endl;    cout << "s修改内部值之后的引用的内存地址:" << ptr << endl;    cout << ptr << endl;    return 0;}

运行结果:

这里写图片描述
上面例子证实了引用一旦定义后,就不能指向其他的地方。
ps:
建议:
1、在如下情况下请使用指针:
- 存在不指向任何对象的可能,引用无法引用空值;
- 可能需要指向不同对象,引用在定以后永远指向一个对象。

2、在如下情况下请使用引用:

  • 总是指向一个对象,并且指向一个对象后就不会改变指向;
  • 重载某个操作符时,需要使用引用:
vector<int> v(10);//建立整型向量,大小为10;v[5]=10;//这个被赋值的目标对象就是操作符[]返回的值;
原创粉丝点击