为什么要返回对小类成员的 const 引用?

Why return a const reference to small class members?

本文关键字:const 引用 成员 小类 返回 为什么      更新时间:2023-10-16

我觉得这个问题肯定在SO的某个地方,但要么我无法找出正确的搜索词,要么不知何故错过了。

假设我有像这样保护其成员的类......

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 的值,以及返回复合对象引用的值,但是小于体系结构指针大小的对象的值是多少?它似乎效率较低且安全性较低,我无法想到任何优势。


我想在我的示例中可以对构造函数进行类似的讨论,但这个问题在这里集中在返回的值上。

这是促使我问这个问题的SO答案。

为什么要返回对小类成员的常量引用?

取决于是否希望调用方能够将引用绑定到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可以随时间变化,则调用方的绑定将反映当前状态,如上例所示。

const &返回到像int这样的类型可能完全没有意义,并且可能会降低性能。将const int&作为函数参数类型传递也可以这样说,但这更容易接受,因为它确实会挫败调用站点上不需要的类型转换。

这只是程序员养成的一个不良习惯。

如果你只谈论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; }
// ^^^^^^^^^^
}