我用C++编程超过5年,并且从未遇到任何建议使用变量引用的地方,除非作为函数参数(如果你不想复制你传递的函数参数).那么有人可能会指出使用C++变量引用的情况(我的意思是它提供了任何优势).
P S*_*ved 16
作为不透明集合访问器/ mutator的返回值
所述operator[]的std::map返回的参考.
缩短引用变量所需的文本
如果你错过了老式with Foo do ...语句(那是Pascal语法),你可以写
MyString &name = a->very->long_->accessor->to->member;
if (name.upcase() == "JOHN") {
name += " Smith";
}
Run Code Online (Sandbox Code Playgroud)
另一个例子可以在Mike Dunlavey的回答中找到
说明某些事情只是一个参考
引用在包装器对象和仿函数中也很有用 - 即在逻辑上不接触任何成员但仅引用它们的中间对象中.
例:
class User_Filter{
std::list<User> const& stop_list;
public: Functor (std::list<User> const& lst)
: stop_list(lst) { }
public: bool operator()(User const& u) const
{ return stop_list.exists(u); }
};
find_if(x.begin(),x.end(),User_Filter(user_list));
Run Code Online (Sandbox Code Playgroud)
这里的想法是,如果你没有在这样一个对象的构造函数中初始化一个引用,那就是编译错误.编译时检查越多 - 程序越好.
Mik*_*vey 11
这是一个方便的案例:
MyClass myArray[N];
for (int i = 0; i < N; i++){
MyClass& a = myArray[i];
// in code here, use a instead of myArray[i], i.e.
a.Member = Value;
}
Run Code Online (Sandbox Code Playgroud)
在任何你想要的地方使用引用,当你被迫时使用指针.
引用和指针共享其语义的一部分:它们是不存在的元素的别名.主要区别在于内存管理:引用清楚地表明您不对资源负责.另一方面,使用指针它永远不会清楚(除非你的意思是智能指针):你是假设删除指针还是外部删除?
必须使用指针时必须管理内存,希望允许可选语义或需要更改稍后引用的元素.
在其他情况下,您可以使用引用或指针,引用更清晰,应该是首选.
现在,正如您所指出的那样,它们实际上并不需要:您可以始终使用指针进行所有参考使用(甚至是参数传递),但是您可以使用单个工具来处理所有事情并不意味着没有更适合的工具为了工作.
我倾向于使用引用成员而不是指针来控制外部控制的非可选构造参数.
编辑(添加示例):
假设您有一个数据库和一个DAO类,它将数据库作为依赖项:
struct Database {};
struct PersonDao {
const Database &m_d;
PersonDao(const Database &d): m_d(d) {}
};
Run Code Online (Sandbox Code Playgroud)
此外,数据库的范围由DAO外部控制:
int main() {
Database d;
PersonDao pd(d);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,使用引用类型是有意义的,因为您不希望DAO :: m_d为null,并且其生命周期是在外部控制的(在本例中来自main函数).