为什么使用函数而不是成员的引用?

Cof*_*ode 30 c++ reference class c++11

我只是测试查看一些代码并注意到类似于:

template<typename T>
class example{
    public:
        example(T t): m_value{t}{}

        const T &value = m_value;

    private:
        T m_value;
};
Run Code Online (Sandbox Code Playgroud)

我以前没见过这个.几乎我以前使用的每个API或库都定义了一个返回成员变量的函数,而不是对它的常量引用:

template<typename T>
class example{
    public:
        example(T t): m_value{t}{}

        const T &value() const{
            return m_value;
        }

    private:
        T m_value;
};
Run Code Online (Sandbox Code Playgroud)

为什么第一种方式不常见?有什么缺点?

gha*_*.st 34

返回适当引用的(内联)函数更好的原因有几个:

  1. 引用将需要每个对象中的内存(通常与指针的数量相同)

  2. 引用通常具有与指针相同的对齐,因此导致周围对象可能需要更高的对齐,从而浪费更多的内存

  3. 初始化引用需要(少量)时间

  4. 具有引用类型的成员字段将禁用默认副本并移动赋值运算符,因为引用不可重定位

  5. 具有引用类型的成员字段将导致自动生成的默认副本和移动构造函数不正确,因为它们现在将包含对其他对象的成员的引用

  6. 函数可以执行其他检查,例如在调试版本中验证不变量

请注意,由于内联,该函数通常不会产生任何超出可能稍大的二进制文件的额外成本.

  • @Deduplicator`const T&value = m_value;`是`T const&`类型的成员变量? (3认同)
  • 我个人认为从长远来看,第6点是最成问题的.这里使用函数的要点实际上是因为代码的演变.每当有一个可能的改进或需要改变的类型,我们需要将代码添加到访问,如果访问是一个参考,甚至是公开的对象,那么我们就需要将其更改为一个功能,因此突破了接口类型,并且还必须更改使用该成员的所有代码.仅仅为了维护大型代码库,该功能是最具前瞻性的接口. (3认同)
  • 直到有人设法推动标准中的"属性". (2认同)