我发现答案不令人满意,所以我加两分钱。
让我们分析以下情况:
错误使用
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
在实现Singleton模式时,这也很常见
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!