Что означает "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.
}
Ответ 5
Функция-член, которая проверяет, то есть читает, а не изменяет или записывает объект. Следующая ссылка мне полезна.
http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.10