Что означает "const" (в контексте) в конце определения функции?

Возможный дубликат:
В чем смысл константы в конце функции-члена?

Если определение моего класса выглядит следующим образом:

type CLASS::FUNCTION(int, const char*) const

Что означает последняя константа после закрывающей скобки и как ее применить к функции:

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

}

Ответы

Ответ 1

Это означает, что эта функция не изменяет наблюдаемое состояние объекта.

В терминах компилятора это означает, что вы не можете вызывать функцию в объекте const (или const reference или const pointer), если эта функция также не объявлена ​​как const. Кроме того, методы, объявленные const, не могут вызывать методы, которые не являются.

Обновление:, поскольку Aasmund полностью корректно добавляет, const позволяют изменять значение членов, объявленных как mutable.

Например, может иметь смысл иметь операцию только для чтения (например, int CalculateSomeValue() const), которая кэширует свои результаты, потому что это дорого для вызова. В этом случае вам нужно иметь член mutable для записи кэшированных результатов.

Я прошу прощения за упущение, я пытался быть быстрым и точным.:)

Ответ 2

означает, что эта функция не будет изменять какие-либо переменные-члены или вызовет любые неконстантные функции-члены.

Если у вас есть ссылка const/указатель на экземпляр класса, вы сможете вызывать функции, отмеченные const следующим образом.

Ответ 3

const в конце функции означает, что он не будет изменять состояние объекта, на который он вызван (т.е. this).

type CLASS::FUNCTION(int, const char*) const ; // Method Signature

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

}

В конце определения метода также нужно указать ключевое слово const. Также обратите внимание, что только члены-функции могут иметь это ключевое слово non-modifier const в конце.

Ответ 4

Это означает, что метод 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.
}