Различие между const и неконстантными версиями методов в C ++ - PullRequest
2 голосов
/ 04 августа 2010

У меня есть несколько вопросов относительно различий между const и неконстантными версиями методов в C ++.

Пример:

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

Мои вопросы:

  1. Можно ли вообще различать, какая версия метода вызывается вручную? Или это полностью / полностью автоматически, и если да, то каковы точные правила для определения, какая версия должна быть вызвана?
  2. Относительно (1), если вы не можете отличить вызов const от неконстантной версии, поэтому невозможно вызвать одну версию метода из другой, чтобы предотвратить дублирование?
  3. Как создать ссылку на ту или иную версию в документации одного из методов с использованием doxygen? (например, «const version of myMethod ().» или «неконстантная версия myMethod ().») Обнаружил это сам - просто добавьте или опустите «const» в конце сигнатуры метода.

Ответы [ 2 ]

5 голосов
/ 04 августа 2010

Я не знаю о доксигене; хотя вот что я знаю.

  1. Если существует только не-1004 * версия, ее просто нельзя вызвать для const объекта.
  2. Если существует только версия const, ее можно вызывать как для const, так и для не const объектов.
  3. Если есть и то и другое, не- const версия будет вызываться для не const объектов, а const версия будет вызываться для const объектов.
  4. Если вы хотите явно вызвать const, вы должны привести свой объект к константной ссылке на себя: static_cast<const MyClass&>(myObject).objectReference();
1 голос
/ 04 августа 2010

Хотя вызов метода не-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"
}
...