Константные переменные в с ++ - PullRequest
2 голосов
/ 05 марта 2011

AFAIK мы не можем изменить значение постоянной переменной в C. Но я столкнулся с этим вопросом интервью, как показано ниже:

В C ++ у нас есть процедура для изменения значения постоянной переменной. Кто-нибудь может сказать мне, как мы можем это сделать?

Ответы [ 6 ]

8 голосов
/ 05 марта 2011

Вы можете изменить изменяемые члены-данные объекта типа класса с константой:

struct awesome_struct {
    awesome_struct() : x(0) { }
    mutable int x;
};

int main() {
    const awesome_struct a;
    a.x = 42;
}

Поведение здесь четко определено.

7 голосов
/ 05 марта 2011

В этих обстоятельствах, я думаю, я бы объяснил ситуацию: попытка изменить значение переменной , которая является const, приводит к неопределенному поведению.Вероятно, он спрашивает, как изменить переменную, которая сама не является const, но на которую вы получили указатель или ссылку на const.В этом случае, когда вы уверены сама переменная не удовлетворяет константам, вы можете отбросить константу с помощью const_cast и продолжить модификацию.

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

Вероятно, также стоит упомянуть, что когда /если переменную, вероятно, потребуется использовать таким образом, вы можете указать, что сама переменная является изменчивой.Это в основном означает, что рассматриваемая переменная никогда не константна, даже если объект, частью которого она является , является константой.

6 голосов
/ 05 марта 2011

Не существует идеального способа отбросить постоянство переменной (которая по определению const) без вызова UB

Скорее всего, интервьюеры не понимают, о чем они говорят.; -)

3 голосов
/ 05 марта 2011

Вы не можете изменить значение постоянной переменной.Попытка сделать это путем обмана компилятора вызывает неопределенное поведение.Компилятор, возможно, не настолько умен, чтобы сказать, что то, что вы делаете, нелегально!

Или, может быть, вы имеете в виду следующее:

const char *ptr= "Nawaz";
ptr = "Sarfaraz";

??

Если это так, то он меняет значение самого указателя, который является не константой, а данные, на которые указывает ptr, является константой, и вы не можете изменить это, например, записавptr[2]='W';.

0 голосов
/ 05 марта 2011

Если переменная const требует изменения значения, то вы обнаружили недостаток в дизайне (в большинстве, если не во всех ситуациях). Если дизайн ваш, отлично! - у вас есть возможность улучшить свой код.

Если дизайн не ваш, удачи, потому что приведенный выше комментарий UB точен. Во встроенных системах переменные const могут быть помещены в ПЗУ. Выполнение трюков в попытке сделать такую ​​переменную доступной для записи приводит к некоторым впечатляющим ошибкам. Кроме того, проблема выходит за рамки простых переменных-членов. Методы и / или функции, помеченные как const, могут быть оптимизированы таким образом, что «отсутствие константности» становится бессмысленным.

(Примите этот «комментарий как ответ» как утверждение к плохому вопросу интервью.)

0 голосов
/ 05 марта 2011

Интервьюер искал const_cast. В качестве дополнительного бонуса вы можете объяснить сценарии, в которых const_cast имеет смысл, например, const_cast<MyClass *>(this)->doSomething() (который может быть совершенно действительным, хотя ИМО не очень чистым), и сценарии, в которых это может быть опасно, например отбрасывание константности передал константную ссылку и, следовательно, нарушил контракт, предоставленный вашей подписью функций.

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