const
о семантике программы а не о деталях реализации. Необходимо отметить функцию членства const
, когда она не изменяет видимое состояние объекта и должна быть вызываемой на объекте, который является самостоятельно const
. В const
функция членства на классе X
, тип this
X const *
: указатель на постоянный X
объект. Таким образом все членские переменные эффективно const
в той функции членства (кроме [1 110]). Если Вы имеете const
объект, можно только звонить const
функции членства на нем.
можно использовать mutable
, чтобы указать, что членская переменная может измениться даже в const
функция членства. Это обычно используется для идентификации переменных, используемых для кэширования результатов, или для переменных, которые не влияют на фактическое заметное состояние, такое как взаимные исключения (все еще необходимо заблокировать взаимное исключение в эти const
функции членства), или счетчики использования.
class X
{
int data;
mutable boost::mutex m;
public:
void set_data(int i)
{
boost::lock_guard<boost::mutex> lk(m);
data=i;
}
int get_data() const // we want to be able to get the data on a const object
{
boost::lock_guard<boost::mutex> lk(m); // this requires m to be non-const
return data;
}
};
при содержании данных указателем, а не непосредственно (включая интеллектуальные указатели такой как [1 116] или boost::shared_ptr
) тогда указатель становится const
в const
функция членства, но не указанный данные, таким образом, можно изменить указанный данные.
Что касается кэширования: в целом компилятор не может сделать этого, потому что состояние могло бы измениться между вызовами (особенно в моем многопоточном примере со взаимным исключением). Однако, если определение встроено тогда, компилятор может вытянуть код в вызов, функционируют и оптимизируют то, что это видит там. Это могло бы привести к функции эффективно только быть названным однажды.
следующая версия Стандарт C++ (C++ 0x) будет иметь новое ключевое слово constexpr
. Функции отметили constexpr
, возвращают постоянную величину, таким образом, результаты могут кэшироваться. Существуют пределы на то, что можно сделать в такой функции (чтобы компилятор мог проверить этот факт).
методам константы также позволяют изменить статических местных жителей. Например, следующее совершенно законно (и повторенные вызовы к панели () возвратят увеличивающие стоимости - не кэшируемый 0):
class Foo
{
public:
int bar() const
{
static int x = 0;
return x++;
}
};
Ключевое слово , изменяемое на членских переменных, позволяет, чтобы функции константы изменили состояние объекта под рукой.
И не, это не делает данных кэша (по крайней мере, не все вызовы), так как следующий код является допустимой функцией константы, которая изменяется со временем:
int something() const { return m_pSomeObject->NextValue(); }
Примечание, что указатель может быть константой, хотя объект указал, не является константой, поэтому вызов к NextValue на SomeObject может или не может изменить свое собственное внутреннее состояние. Это заставляет функцию что-то возвращать различные значения каждый раз, когда это называют.
Однако я не могу ответить, как компилятор работает с методами константы. Я услышал, что это может оптимизировать определенные вещи, хотя я должен был бы искать его, чтобы быть бесспорным.
В этом контексте const
функция членства означает, что this
рассматривается как const
указатель также. На практике это означает, что Нельзя изменить состояние this
внутренняя часть const
функция членства.
Для функций без побочных эффектов (т.е. чего Вы пытаетесь достигнуть), GCC имеет "функциональный атрибут", названный pure
(Вы используете его путем высказывания __attribute__((pure))
): http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
Вдобавок к тому, что функция членства может изменить глобальные данные, для функции членства возможно изменить явно объявленных изменяемых членов рассматриваемого объекта.
Ключевое слово константы на функции членства отмечает этот параметр как постоянный. Функция может все еще отключить звук глобальных данных (так не может кэшироваться), но не данные объектов (обеспечение запросов к объектам константы).
Я сомневаюсь относительно него, функция могла все еще вызвать глобальную функцию, которая изменила состояние мира, и не нарушают константу
Corey корректен, но примите во внимание, что любые членские переменные, которые отмечены как изменяемый , могут быть измененными в функциях членства константы.
Это также означает, что эти функции могут быть вызваны от других функций константы, или через другие ссылки константы.
<час>Редактирование: Прокляните, был разбит на 9 секунд.... 9!!!:)
Нет.
метод константы А является методом, который не изменяет состояние объекта (т.е. его поля), но Вы не можете предположить, что, учитывая тот же вход, возвращаемое значение метода константы определяется. Другими словами, const
ключевое слово НЕ подразумевает, что функция является непосредственной. Например, метод, который возвращает текущее время, является методом константы, но его возвращаемое значение изменяется между вызовами.