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

时间:2010-08-04 02:47:46

标签: c++ documentation doxygen

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

示例:

      MyObject* MyClass::objectReference()
const MyObject* MyClass::objectReference() const

我的问题是:

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

虽然在const实例上调用非const方法可能并不明智。但是,如果要在非const实例上调用const方法,只需使用强制转换。有关示例,请参阅以下程序:

#include <iostream>

class ConstTest {
public:
  void cows() const {
    std::cout << "const method call" << std::endl;
  };

  void cows() {
    std::cout << "non-const method call" << std::endl;
  }
};

int main() {
  ConstTest ct;

  ct.cows();                                 // Prints "non-const method call"
  static_cast<const ConstTest &>(ct).cows(); // Prints "const method call"
}