我觉得这个问题肯定会出现在某个地方,但要么我能找出正确的搜索条件,要么就会错过。
假设我有一个保护其成员的课程......
class MyClass {
int m_value;
public:
MyClass(int v) : m_value(v) {}
int value() const { return m_value; }
}
我已经看到了遍及SO的示例代码,而是返回对成员变量的const引用,如此...
class MyClass {
int m_value;
public:
MyClass(int v) : m_value(v) {}
const int& value() const { return m_value; }
// ^^^^^^^^^^
}
我理解一般返回const的值,以及返回复合对象引用的值,但是对象的值小于体系结构的指针大小?它似乎效率低,安全性差,没有我能想到的优势。
我想在我的例子中可以对构造函数进行类似的讨论,但是这个问题主要集中在返回的值上。
This is the SO answer促使我提出这个问题。
答案 0 :(得分:3)
将const &
返回到类似int
的类型可能完全没有意义,可能会降低性能。将const int&
作为函数参数类型传递也可以说同样的事情,但这更可接受,因为它确实在调用站点击败了不需要的类型转换。
这只是程序员已经习惯的恶习。
答案 1 :(得分:3)
为什么将const引用返回给小类成员?
取决于您是否希望调用者能够绑定对m_value的引用。
MyClass myObj;
int const& keep_an_eye_on_you = myObj.value();
cout << "Was: " << keep_an_eye_on_you << endl;
myObj.doSomething(); // say this changes the value held in m_value
cout << "Now: " << keep_an_eye_on_you << endl;
如果m_value实际上是不可变的,那么它无关紧要(除了性能问题,其他人已经表达过)。
如果m_value可以随时间变化,那么调用者的绑定将反映当前状态,如上例所示。
答案 2 :(得分:2)
如果你只谈int
,那么是的,这可能毫无意义。但是当您知道以后可以更改返回或参数类型并且使用别名时,放置const &
会很有用,所以以后您只需要更改别名值,该值可以超过8字节。喜欢这个
class MyClass {
using TInnerType = int;
TInnerType m_value;
public:
MyClass(const TInnerType& v) : m_value(v) {}
const TInnerType& value() const { return m_value; }
// ^^^^^^^^^^
}