当与C++中的方法一起使用时,const运算符的含义是什么?

Ber*_*ard 8 c++

给出这样的声明:

class A {
public:
    void Foo() const;
};
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

谷歌出现了这个:

如果成员函数可以在const(this)对象上操作,则应在其后面使用const关键字声明它们.如果函数未声明为const,则无法应用于const对象,并且编译器将给出错误消息.

但我发现有点令人困惑; 任何人都可以用更好的条件吗?

谢谢.

Hen*_*enk 12

考虑一下你班级的变化A.

class A {
public:
    void Foo() const;
    void Moo();

private:
    int m_nState; // Could add mutable keyword if desired
    int GetState() const   { return m_nState; }
    void SetState(int val) { m_nState = val; }
};

const A *A1 = new A();
A *A2 = new A();

A1->Foo(); // OK
A2->Foo(); // OK

A1->Moo(); // Error - Not allowed to call non-const function on const object instance
A2->Moo(); // OK
Run Code Online (Sandbox Code Playgroud)

const函数声明中的关键字向编译器指示函数在合同中有义务不修改状态A.因此,您无法在其中调用非const函数,A::Foo也无法更改成员变量的值.

为了说明,Foo()可能不会A::SetState因为声明为非调用而调用const,A::GetState但是可以,因为它是显式声明的const.m_nState除非使用关键字声明,否则不得更改该成员mutable.

这种用法的一个例子const是'getter'函数来获取成员变量的值.

@ 1800信息:我忘了可变!

mutable关键字指示编译器以接受修改的成员变量否则就会导致编译错误.它在函数需要修改状态时使用,但无论修改如何,对象都被视为逻辑一致(常量).


Pat*_*otz 5

这不是一个答案,只是一个侧面评论.这是强烈推荐申报变量和常量const尽可能.

  1. 这会将您的意图传达给您班级的用户(甚至/尤其是您自己).
  2. 编译器会让你对这些意图保持诚实. - 即,它就像编译器检查文档.
  3. 根据定义,这可以防止您不期望的状态更改,并且可能允许您在方法中做出合理的假设.
  4. const有一种有趣的方式来传播你的代码.因此,const尽可能早地开始使用是一个非常好的主意.决定const在游戏后期启动代码可能会很痛苦(容易,但很烦人).

如果你正在使用一种静态的语言,编译时检查,尽可能多地使用它们是一个好主意......它只是另一种测试.