[C++进阶]仔细区别pointers 和reference
2020-04-19 本文已影响0人
小鱼号的代码日记
一个reference必须总代表某个对象,没有所谓的null reference。
永远不要考虑”reference成为null ”的可能性。
所以如果你有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能不指向(代表)任何对象,那么你应该使用pointer,因为你可以将pointer设为null。换个角度看,如果这个变量总是必须代表一个对象,也就是说如果你的设计不允许这个变量为null,那么你应该使用reference.
Pointers可以被重新赋值,指向另一个对象,reference却总是指向(代表)它最初获得的那个对象。
总结:
当你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符(operator[ ])而其语法需要无法由pointers达成,你就应该选择references.任何其他时候,请采用pointers。
/***************************
more effectivre c++
35个改善编程与设计的有效方法
条款1:仔细区别pointer和references
---------小鱼号的代码日记--------------
****************************/
#include<iostream>
#include<vector>
using namespace std;
///使用reference之前不要测试其有效性
void printDouble(const double & rd)
{
cout << rd; //不需要测试rd,它一定代表么某个double
}
///使用pointers,通常就得测试它是否为null
void printDouble(const double *pd)
{
if(pd) //检查是否为null pointer
{
cout << *pd;
}
}
int main()
{
char *pc = 0;//将pointer 设定为null
char &rc = *pc;//让reference代表null pointer的解引用
///我们将永远不再考虑“reference” 成为null的可能性
///string& rs;//错误!reference必须有初值
///string s("xyzzy");
///string &rs = s; //没问题,rs指向s。
///string *ps;//未初始化的指针,有效,但风险高。
string s1("Nancy");
string s2("Clancy");
string& rs = s1; //rs代表s1
string *ps = &s1; //ps指向s1
rs = s2; //rs仍然代表s1
//但是s1的值现在变成了“Clancy”
ps = &s2; //ps现在指向s2
//s1没有变化
vector<int> v(10);
v[5] = 10; //assignment的赋值对象是operator[]的返回值
///如果operator[]的返回pointer,上述最后一个语句就必须写成这样子:
/// *v[5] = 10;
///你应该总是令operator[]返回一个reference
///总结:
///当你需要指向某个东西,而且绝不会改变指向其他东西,
/// 或是当你实现一个操作符(operator[ ])而其语法需要无法由pointers达成,
/// 你就应该选择references.任何其他时候,请采用pointers。
return 0;
}
内容选自:
more effectivre c++
35个改善编程与设计的有效方法