为什么要返回对小类成员的 const 引用?
Why return a const reference to small class members?
我觉得这个问题肯定在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; }
// ^^^^^^^^^^
}
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 如何在构造函数中传递 const 引用时强制编译器不接受右值
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 对临时对象的Const引用不会延长其生存期
- 对 const 引用参数使用默认值会导致崩溃
- 在运算符重载中使用带有 const 引用的 friend 函数
- C++通过 const 引用传递时不调用派生类函数
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 为什么要返回对小类成员的 const 引用?
- C - 最好将枚举类作为值或const引用
- RVO:返回由值传递的值,即使显式分配给 const 引用也是如此
- const引用与可变成员的对象
- 每当传递lvalue时,每当通过rvalue传递时,将const引用存储
- 对类成员而不是 getter 的 Const 引用
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 在函数中使用 const 引用参数访问函数中成员的最佳实践 C++.
- STD ::配对的const引用如何工作
- 为什么我的C 函数拒绝返回const引用