快捷搜索:

More Effective C++:指针与引用的区别

指针与引用看上去完全不合(指针用操作符’*’和’->’,引用应用操作符’.’),然则它们彷佛有相同的功能。指针与引用都是让你间接引用其他工具。你若何抉择在什么时刻应用指针,在什么时刻应用引用呢?

首先,要熟识到在任何环境下都不能用指向空值的引用。一个引用必须老是指向某些工具。是以假如你应用一个变量并让它指向一个工具,然则该变量在某些时刻也可能不指向任何工具,这时你应该把变量声明为指针,由于这样你可以赋空值给该变量。相反,假如变量肯定指向一个工具,例如你的设计不容许变量为空,这时你就可以把变量声明为引用。

“然则,请等一下”,你狐疑地问,“这样的代码会孕育发生什么样的后果?”

char *pc = 0; // 设置指针为空值

char& rc = *pc; // 让引用指向空值

这是异常有害的,毫无疑问。结果将是不确定的(编译器能孕育发生一些输出,导致任何工作都有可能发生),应该躲开写出这样代码的人除非他们批准改正差错。假如你担心这样的代码会呈现在你的软件里,那么你最好完全避免应用引用,要不然就去让更优秀的法度榜样员去做。我们今后将轻忽一个引用指向空值的可能性。

由于引用肯定会指向一个工具,在C里,引用应被初始化。

string& rs; // 差错,引用必须被初始化

string s("xyzzy");

string& rs = s; // 精确,rs指向s

指针没有这样的限定。

string *ps; // 未初始化的指针

// 合法但危险

不存在指向空值的引用这个事实意味着应用引用的代码效率比应用指针的要高。由于在应用引用之前不必要测试它的合法性。

void printDouble(const double& rd)

{

cout

相反,指针则应该老是被测试,防止其为空:

void printDouble(const double *pd)

{

if (pd) { // 反省是否为NULL

cout

指针与引用的另一个紧张的不合是指针可以被从新赋值以指向另一个不合的工具。然则引用则老是指向在初始化时被指定的工具,今后不能改变。

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 v(10); // 建立整形向量(vector),大年夜小为10;

// 向量是一个在标准C库中的一个模板

v[5] = 10; // 这个被赋值的目标工具便是操作符[]返回的值

假如操作符[]返回一个指针,那么后一个语句就得这样写:

*v[5] = 10;

然则这样会使得v看上去象是一个向量指针。是以你会选择让操作符返回一个引用。

当你知道你必须指向一个工具并且不想改变其指向时,或者在重载操作符并为防止不需要的语义误解时,你不应该应用指针。而在除此之外的其他环境下,则应应用指针。

您可能还会对下面的文章感兴趣: