为什么将const引用返回给小类成员?

时间:2018-05-02 14:35:10

标签: c++ class reference

我觉得这个问题肯定会出现在某个地方,但要么我能找出正确的搜索条件,要么就会错过。

假设我有一个保护其成员的课程......

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促使我提出这个问题。

3 个答案:

答案 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; }
// ^^^^^^^^^^
}