【问题标题】:C++ const in getter吸气剂中的 C++ const
【发布时间】:2014-02-24 01:05:52
【问题描述】:

我仍在学习 C++,并且我正在阅读所有我必须使用const 的地方(我认为是出于速度原因)。

我通常这样写我的getter方法:

const bool isReady() {
    return ready;
}

但我已经看到一些 IDE 以这种方式自动生成 getter:

bool getReady() const {
    return ready;
}

但是,在编写委托时,如果const 在函数之后,我碰巧发现了这个错误:

member function 'isReady' not viable: 'this' argument has type 'const VideoReader', but function is not marked const

那么,编写 const getter 的更好方法是什么?我真的需要关心吗?

【问题讨论】:

标签: c++ constants getter


【解决方案1】:

这两种方式有很大的不同。

const bool isReady()

上面的代码会返回一个const bool,但不保证对象不会改变其逻辑状态。

bool isReady() const

这将返回一个bool,它保证你的对象的逻辑状态不会改变。在这种情况下,不需要在返回类型前面写const。返回const bool 是没有意义的,因为它无论如何都是副本。所以让它const 是没用的。第二个constconst correctness 所需要的,不是为了速度,而是为了让你的程序更加可靠和安全。

【讨论】:

【解决方案2】:

它们意味着两个不同的东西:

const bool isReady() {
    return ready;
}

这将返回一个常量布尔值。意思是一个 bool,它从创建之时起就无法更改值。

bool getReady() const { 
    return ready;
}

这是一个常量函数,意思是一个不会改变它所属类的任何成员变量的函数。这是推荐用于 getter 的样式,因为它们的唯一目的是检索数据,并且不应在此过程中修改任何内容。

【讨论】:

  • 我认为这是最完整和简洁的答案。
【解决方案3】:

const 方法通知编译器您不会修改调用此方法的类实例:

class A {
public:
bool getReady() const {
    return ready;
}
};

因此,如果您尝试在 getReady() 中修改对象,那么编译器将发出错误。 const 方法在你有的地方很有用,例如:const A& 或 const A*,那么你只能在这些对象上调用 const 方法。

至于:

const bool isReady() {
    return ready;
}

这个 const 实际上并没有提供真正的好处,因为 bool 在 isReady() 返回时被复制。如果返回的类型是 const char*const A&,则这样的 const 是有意义的,在这种情况下,const 使您的 char 字符串或 A 类实例不可变。

【讨论】:

    【解决方案4】:

    一个 const getter 有签名

    bool getReady() const
    

    另一个版本不是const方法,它只是返回一个const值(基本上没用)。

    拥有const getter 允许您在 const 对象上调用它:

    const Object obj;
    obj.getReady();
    

    这仅在getReady 被标记为const 时有效。

    【讨论】:

      【解决方案5】:

      使用const 关键字作为返回类型或方法签名是有区别的。在第一种情况下,返回的值将是一个常量值。在第二种情况下,该方法将是一个所谓的常量方法,它不能改变对象的表示。在常量对象上,只有常量方法是可调用的。

      【讨论】:

        猜你喜欢
        • 2023-02-02
        • 1970-01-01
        • 2018-11-16
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-26
        • 2013-06-07
        相关资源
        最近更新 更多