我发现这些答案不令人满意,所以我要发表我的意见。
让我们来分析以下案例:
错误的用法
int& getInt()
{
int x = 4;
return x;
}
这显然是错误的
int& x = getInt(); // will refer to garbage
静态变量的使用
int& getInt()
{
static int x = 4;
return x;
}
这是正确的,因为静态变量在程序的整个生命周期中都存在。
int& x = getInt(); // valid reference, x = 4
这在实现单例模式时也很常见
class Singleton
{
public:
static Singleton& instance()
{
static Singleton instance;
return instance;
};
void printHello()
{
printf("Hello");
};
};
用法:
Singleton& my_sing = Singleton::instance(); // Valid Singleton instance
my_sing.printHello(); // "Hello"
运营商
标准库容器在很大程度上依赖于返回引用的操作符的使用
T & operator*();
可用于以下
std::vector<int> x = {1, 2, 3}; // create vector with 3 elements
std::vector<int>::iterator iter = x.begin(); // iterator points to first element (1)
*iter = 2; // modify first element, x = {2, 2, 3} now
快速访问内部数据
有时&可以用于快速访问内部数据
Class Container
{
private:
std::vector<int> m_data;
public:
std::vector<int>& data()
{
return m_data;
}
}
的用法:
Container cont;
cont.data().push_back(1); // appends element to std::vector<int>
cont.data()[0] // 1
然而,这可能会导致如下陷阱:
Container* cont = new Container;
std::vector<int>& cont_data = cont->data();
cont_data.push_back(1);
delete cont; // This is bad, because we still have a dangling reference to its internal data!
cont_data[0]; // dangling reference!