给出这样的声明:
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
关键字指示编译器以接受修改的成员变量否则就会导致编译错误.它在函数需要修改状态时使用,但无论修改如何,对象都被视为逻辑一致(常量).
这不是一个答案,只是一个侧面评论.这是强烈推荐申报变量和常量const
尽可能.
const
有一种有趣的方式来传播你的代码.因此,const
尽可能早地开始使用是一个非常好的主意.决定const
在游戏后期启动代码可能会很痛苦(容易,但很烦人).如果你正在使用一种静态的语言,编译时检查,尽可能多地使用它们是一个好主意......它只是另一种测试.