getter中的C++ const

nki*_*int 18 c++ getter const

我还在学习C++,我到处都在阅读,我必须尽可能地使用const它(出于速度原因,我认为).

我经常写这样的getter方法:

const bool isReady() {
    return ready;
}
Run Code Online (Sandbox Code Playgroud)

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

bool getReady() const {
    return ready;
}
Run Code Online (Sandbox Code Playgroud)

但是,写代表,如果const在函数之后,我发现这个错误:

member function 'isReady' not viable: 'this' argument has type 'const VideoReader', but function is not marked const
Run Code Online (Sandbox Code Playgroud)

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

mka*_*aes 43

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

const bool isReady()
Run Code Online (Sandbox Code Playgroud)

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

bool isReady() const
Run Code Online (Sandbox Code Playgroud)

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

  • "你真的应该读到这个"你能给我一些链接吗? (4认同)
  • @nkint:例如Scott Meyers的有效C++或Herb Sutter的Exceptional C++.这是旧的http://www.gotw.ca/gotw/006.htm和C++ 11,这甚至更重要.http://herbsutter.com/2013/05/24/gotw-6a-const-correctness-part-1-3/ (3认同)

Dia*_*ana 22

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

const bool isReady() {
    return ready;
}
Run Code Online (Sandbox Code Playgroud)

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

bool getReady() const { 
    return ready;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这是最完整、最简洁的答案。 (2认同)

mar*_*inj 7

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

class A {
public:
bool getReady() const {
    return ready;
}
};
Run Code Online (Sandbox Code Playgroud)

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

至于:

const bool isReady() {
    return ready;
}
Run Code Online (Sandbox Code Playgroud)

这个const实际上没有真正的好处,因为在isReady()返回时复制了bool.这样的const对子级意义,如果返回类型是const char*const A&,在这种情况下const让你的字符的字符串或一个类的实例是不可改变的.