在函数定义的末尾,"const" 的意思是什么(在上下文中)?

28
如果我的类定义如下:
type CLASS::FUNCTION(int, const char*) const

最后一个const在闭括号之后的意思是什么,我如何将其应用于函数?
type CLASS::FUNCTION(int var1, const char* var2) {

}

2
这可能是一个重复的问题,但回答比寻找答案更容易。它意味着成员函数可以在const对象上调用(或通过引用或指向常量的指针调用),并且成员函数不能修改数据成员(除非它们被标记为mutable)。实际上,它使this在函数中成为指向常量的指针。通常你会说“FUNCTION是一个const成员函数”,不过我不记得这个术语是否在标准中。 - Steve Jessop
@Steve:这个问题在__FAQ条目__中已经有了答案。我是通过在浏览器地址栏中输入c++-faq,然后跳转到http://stackoverflow.com/questions/tagged/c++-faq进行搜索const,最终找到了URL。不到30秒就解决了。 - sbi
@sbi:好吧,我肯定不会打120个单词每分钟,所以你赢了。如果我记录下打这条评论花费的时间,我们就可以知道具体速度。但是,如果这不是一个常见问题解答入口,你的策略就行不通了,那么如何考虑这种风险呢? - Steve Jessop
此外,将"c++-faq"键入我的浏览器地址栏并不能带我到SO标签,而是进入了Cline的FAQ-lite。所以你又赢了 :-) - Steve Jessop
@Steve:当一个问题看起来像是之前已经被问过很多次时,我总是首先查看常见问题解答列表。如果我找不到它,我会考虑将其中一个重复的问题添加到列表中。这个问题就是这样一个候选者,只是现在已经是凌晨1:30了,我得去睡觉了,不能再寻找重复的问题了。哦,我的浏览器在我输入c++-faq时首先建议我访问SO的C++常见问题解答列表,因为我经常访问那个页面。 :) - sbi
5个回答

39

这意味着该函数不会修改对象的可观察状态。

在编译器术语中,这意味着您不能对const对象(或const引用或const指针)调用函数,除非该函数也被声明为const。此外,声明为const的方法不允许调用未声明为const的方法。

更新:正如Aasmund完全正确地补充的,const方法允许更改声明为mutable的成员变量的值。

例如,可能有一个只读操作(例如 int CalculateSomeValue() const),它会缓存其结果,因为调用代价高昂。在这种情况下,您需要拥有一个mutable成员变量来将缓存结果写入其中。

我很抱歉忽略了这一点,我试图简洁明了。:)


5
对于“不修改可观察状态”的表述表示赞同。需要进一步解释一下:任何标记为 mutable 的成员变量都可能被 const 函数所修改。因此,mutable 应该只用于对外界“不可见”的内部数据记录。 - Aasmund Eldhuset
这个答案没有解释机制如何实际工作,即通过将 *this 的类型从非 const 更改为 const。因此,答案中提到的影响仅是 *this 变为 const 的结果。 - Askaga

5
在函数结尾处加上const表示它不会修改被调用对象(即this)的状态。
type CLASS::FUNCTION(int, const char*) const ; // Method Signature

type CLASS::FUNCTION(int var1, const char* var2) const {

}

你需要在方法定义的末尾提到关键字const。同时要注意的是,只有成员函数才能在其末尾使用这个非修饰符关键字const


2

这意味着该函数不会修改任何成员变量或调用任何非const成员函数。

如果您有一个指向该类实例的const引用/指针,那么只能调用被标记为const的函数。


1

这意味着该方法是一个const方法,表示该方法不会修改任何成员变量,因此可以在对象为const的情况下使用。

class Foo
{
   public:
      void foo(int a) { m = a; }
      int bar() const { return m; }
   private:
      int m;
};

int baz(const Foo* ptr)
{
   ptr->foo(10); // Not legal, Foo::foo is not const, and ptr is pointer to const.
   return ptr->bar(); // Legal, Foo::bar is a const method, and does not modify anything.
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接