现在,这是高度概念化的。我不知道我是否理解正确,所以请帮助我理解其中的区别。
假设 name
是一个私有(private)的 std::string
数据成员,由 getName()
访问器函数访问:
const string& getName() const {
return name;
}
现在,这将返回对 name
的引用,这只是别名的另一个词。因此,将返回一个别名,即返回 name
数据成员。这是允许的还是会破坏数据隐藏的全部目的?
换句话说,上述方法与常规的方法到底有何不同:
string getName() const {
return name;
}
???
最后,实现前者而不是后者真的值得吗?
首先,如果基础值可能发生变化,那么引用确实会出现问题,尤其是在多线程执行的上下文中。因此,数据成员的值在对象的生命周期内不会改变几乎是一个基本假设。它实际上是一个常数。
现在,引用的一个主要问题是它公开了实现细节,因此很难更改实现。
一个更具学术性的问题是它可能会破坏代码,如果之前有按值返回,或者只是因为它不寻常。例如
const string s& = foo().name();
foo()
通过值返回一个对象,而 name()
通过引用返回一个字符串,这为您提供了一个悬空引用,而不是天真地预期的延长生命周期.我称之为学术,因为我无法想象有人会这样写。尽管如此,墨菲定律等等。
它可能不会(显着)比值返回更有效,正是因为它不太可能仅用于初始化引用。
所以:
可能不会明显更有效,
防止轻易改变实现,
还有学术问题,产生悬空引用。
总而言之,就是不要。
这是过早的优化和复杂化。