C++中方法的const和非const版本之间的区别

Jak*_*les 2 c++ documentation doxygen

关于C++中const和非const方法之间的区别,我有几个问题.

例:

      MyObject* MyClass::objectReference()
const MyObject* MyClass::objectReference() const
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 有没有办法区分手动调用哪个版本的方法?或者它是完全/完全自动的,如果是,那么确定调用哪个版本的准确规则是什么?
  2. 与(1)相关,如果你不能区分调用const和非const版本,那么就不可能从另一个版本调用一个方法版本来防止重复?
  3. 如何在使用doxygen的方法的文档中创建一个版本或另一个版本的链接?(例如"myMethod()的const版本."或"myMethod()的非const版本.") 我自己发现了 - 只需在方法签名的末尾添加或省略"const".

zne*_*eak 5

我不知道doxygen; 虽然这是我所知道的.

  1. 如果只有非const版本,则无法在const对象上调用它.
  2. 如果只有一个const版本,则可以在constconst对象和非对象上调用它.
  3. 如果同时存在,const则将在非const对象上调用非版本,并且const将在const对象上调用该版本.
  4. 如果要显式调用该const对象,则必须将对象转换为自身的const引用:static_cast<const MyClass&>(myObject).objectReference();

  • @Duracell:我宁愿只使用`const_cast`来删除`const`修饰符,因为`static_cast`在添加它时表现很好. (4认同)
  • @Duracell @zneak:这是[一个`implicit_cast`函数模板]的一个很好的用例(http://stackoverflow.com/questions/868306/what-is-the-difference-between-static-cast-and-implicit -cast/869597#869597). (3认同)
  • 为了完整性,可能有兴趣的是函数指针也可用于区分两者:`(void(X ::*)()const)&X :: f;` - 用于消除`bind()`et的歧义人. (3认同)