getter中的C ++ const

时间:2014-01-31 10:57:34

标签: c++ const getter

我还在学习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的更好方法是什么?我真的需要关心吗?

5 个答案:

答案 0 :(得分:39)

这两种方式之间存在巨大差异。

const bool isReady()

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

bool isReady() const

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

答案 1 :(得分:21)

它们意味着两件不同的事情:

const bool isReady() {
    return ready;
}

这会返回一个常量bool。意思是一个bool,它不能在创建时改变值。

bool getReady() const { 
    return ready;
}

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

答案 2 :(得分:7)

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

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

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

至于:

const bool isReady() {
    return ready;
}

这个const实际上没有提供任何实际好处,因为在isReady()返回时复制了bool。如果返回的类型是constconst char*,那么const A&就有意义了,在这种情况下,const会使您的char字符串或A类实例不可变。

答案 3 :(得分:3)

对于返回类型或方法签名使用const关键字之间存在差异。在第一种情况下,返回的值将是一个常量值。在第二种情况下,该方法将是所谓的常量方法,其不能改变对象的表示。在常量对象上,只有常量方法可以调用。

答案 4 :(得分:2)

const getter具有签名

bool getReady() const

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

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

const Object obj;
obj.getReady();

仅当getReady标记为const时才有效。