指针,引用的适用场合
大多数情况下,使用引用传递参数可以达到指针的相同效果(减少传值方式下复制参数带来的开销)。但:
如果程序需要先指向一个对象,然后再改为指向另一个对象,则只能用指针;
引用不能是空,因此如果被讨论对象有可能为空,则必须使用指针。
例子:
// 在给内存赋值前确定是否发生错误
int* pInt = new int;
if (pInt != NULL)
int& rInt = *pInt;
注意:
不要返回不在作用域内的对象的引用。
比如从函数里返回局部变量的引用。
不要返回堆中对象的引用。(当指针所指的内存用 delte 释放时,原先的引用现在没有意义了,变成了空引用。错误!)
由一个函数建立内存而让另一个函数释放它是危险的。
如果函数必须建立内存并传递给调用函数,考虑改变一下接口。让调用函数分配内存,然后用引用传递给函数。这样可以把内存管理工作转移到外面的函数中,有外面的函数删除它。
要/不要
只要可能就用引用传递参数。
只要可能就返回引用。
如果能用引用就不要用指针。
只要可能就使用 const 保护引用和指针。
不要返回局部变量的引用。
必要时用值传递参数。
必要时返回值。
不要返回有可能退出作用域的引用。
不要引用空对象。
如果程序需要先指向一个对象,然后再改为指向另一个对象,则只能用指针;
引用不能是空,因此如果被讨论对象有可能为空,则必须使用指针。
例子:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
注意:
不要返回不在作用域内的对象的引用。
比如从函数里返回局部变量的引用。
不要返回堆中对象的引用。(当指针所指的内存用 delte 释放时,原先的引用现在没有意义了,变成了空引用。错误!)
由一个函数建立内存而让另一个函数释放它是危险的。
如果函数必须建立内存并传递给调用函数,考虑改变一下接口。让调用函数分配内存,然后用引用传递给函数。这样可以把内存管理工作转移到外面的函数中,有外面的函数删除它。
要/不要
只要可能就用引用传递参数。
只要可能就返回引用。
如果能用引用就不要用指针。
只要可能就使用 const 保护引用和指针。
不要返回局部变量的引用。
必要时用值传递参数。
必要时返回值。
不要返回有可能退出作用域的引用。
不要引用空对象。