给出这样的声明:
class A { public: void Foo() const; };
这是什么意思?
谷歌出现了这个:
如果成员函数可以在const(this)对象上操作,则应在其后面使用const关键字声明它们.如果函数未声明为const,则无法应用于const对象,并且编译器将给出错误消息.
但我发现有点令人困惑; 任何人都可以用更好的条件吗?
谢谢.
考虑一下你班级的变化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
const
函数声明中的关键字向编译器指示函数在合同中有义务不修改状态A
.因此,您无法在其中调用非const
函数,A::Foo
也无法更改成员变量的值.
为了说明,Foo()可能不会A::SetState
因为声明为非调用而调用const
,A::GetState
但是可以,因为它是显式声明的const
.m_nState
除非使用关键字声明,否则不得更改该成员mutable
.
这种用法的一个例子const
是'getter'函数来获取成员变量的值.
@ 1800信息:我忘了可变!
该mutable
关键字指示编译器以接受修改的成员变量否则就会导致编译错误.它在函数需要修改状态时使用,但无论修改如何,对象都被视为逻辑一致(常量).
这不是一个答案,只是一个侧面评论.这是强烈推荐申报变量和常量const
尽可能.
这会将您的意图传达给您班级的用户(甚至/尤其是您自己).
编译器会让你对这些意图保持诚实. - 即,它就像编译器检查文档.
根据定义,这可以防止您不期望的状态更改,并且可能允许您在方法中做出合理的假设.
const
有一种有趣的方式来传播你的代码.因此,const
尽可能早地开始使用是一个非常好的主意.决定const
在游戏后期启动代码可能会很痛苦(容易,但很烦人).
如果你正在使用一种静态的语言,编译时检查,尽可能多地使用它们是一个好主意......它只是另一种测试.