我还在学习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的更好方法是什么?我真的需要关心吗?
答案 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。如果返回的类型是const
或const 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
时才有效。