Как компилятор удостоверяется, что состояние члена данных не изменяется в функции-члене const? (либо в C ++, либо в Java) - PullRequest
5 голосов
/ 20 апреля 2011

Как компилятор C ++ или Java может убедиться, что ни одно из переменных-членов не изменено в функции-члене const (изменяемое является исключительным).

Будет ли компилятор делать что-то вроде помещения кода в недоступный для записи сегмент кода или что-то в этом роде?

Ответы [ 7 ]

3 голосов
/ 20 апреля 2011

Компилятор не уверен.Это невозможно, поскольку в языке нет правила, согласно которому состояние переменной-члена не может быть изменено в const функции-члене.Единственное правило заключается в том, что вы не можете изменить состояние с помощью указателя this (без исключения const).

3 голосов
/ 20 апреля 2011

Для C ++ const проверка выполняется во время компиляции через логику компилятора. Это гарантирует, что если функция помечена const, то в переменные-члены не будет внесено никаких изменений. Я не думаю, что это имеет какое-либо отношение к хранению исполняемого кода.

Для Java я не знал, что существует та же самая парадигма const.

1 голос
/ 20 апреля 2011

Компилятор C ++ сообщит об ошибке, если вы попытаетесь изменить переменную-член (прямо или косвенно, вызвав неконстантную функцию) в const-функции (если только эта переменная не помечена как изменяемая).Вы можете обойти это с броском.Компилятор не будет (и не должен) делать что-либо еще для принудительного применения констант во время выполнения.

Я не могу говорить с Java.

0 голосов
/ 21 апреля 2011

И еще одно добавление вышеупомянутых пунктов, чтобы сделать его простым.В константных функциях компилятор делает это постоянным указателем.поэтому const int a = 10 ;, a = 20, очевидно, выдает ошибки.

0 голосов
/ 20 апреля 2011

В C ++ квалификатор const является классификатором типа.На самом деле, квалифицированным по имени const является (после стандарта) разработанный тип .

При выполнении разрешения перегрузки функции компиляторы, таким образом, применяют обычный механизм, который запрещает вам вызывать void foo(int) с std::string в качестве аргумента, например.

Они могут, однако, иметь лучшую диагностику для этой конкретной ошибки, чтобы помочь разработчику.

В C ++ это особенно иллюстрируетсяфакт, что const_cast доступен для удаления константности объекта ... Существует только одна тонкость:

Объекты, которые создаются в области видимости файла(globals, statics, ...) и объявленные const могут быть помещены в постоянную память по усмотрению компилятора, в этом случае попытка const_cast означает неопределенное поведение .

0 голосов
/ 20 апреля 2011

В C ++ : компилятор обнаруживает очевидные ошибки, то есть вызовы неконстантной функции для переменной-члена (или объекта this). Он включает в себя вызов оператора = и т. Д. Он обычно выводит «не может преобразовать из const ... T ... в ... T ...».

Если вы хотите обойти это, вы можете использовать const_cast.

Следует отметить, что постоянство функции НЕ означает, что состояние объекта не изменится после вызова. Например, с этим кодом:

class A
{
public:
  // stuff...
  //
  int* getPointer() const {return mpA;}
private:
  int* mpA;
}

вы можете получить доступ к значению, указанному mpA извне, и изменить его ... Сам объект mpA не будет изменен (поэтому соблюдается постоянство getPointer), но постоянство значения это mpA указывает на не гарантируется. Это действительно было бы слишком много работы, чтобы гарантировать это.

0 голосов
/ 20 апреля 2011

В C ++: const квалификатор функции просто делает каждый неизменяемый член класса и указатель this const квалифицированным в этом теле функции.Вот и все.

ADD:

Это означает, что если const-функция явно или неявно обращается к this указателю как неконстантному указателю, это приведет к ошибке компиляции.1010 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...