2016-09-27 4 views
0

Как создать простой неизменяемый int на C++? У меня есть функция:Иммутируемый int в C++

int NOD(const int &a, const int &b) { 
    if (b == 0) {return a;} 
    const int remainder = a % b; 
    return NOD(b, remainder); 
} 

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

*(int *)&a = 555; 

он ломает все. Как сделать неизменяемые переменные в C++?

+6

Да, если вы отбросили все свои защиты, вы не получите никакой защиты. В какой-то момент это просто память и память. – xaxxon

+0

@xaxxon есть способ сказать: 1. Эта память не изменчива и 2. Эта ссылка на эту память не изменчива? – USER

+0

Возможно, какой-то вариант операционной системы может сделать что-то подобное, но он не является частью стандарта C++. Ссылки никогда не изменяются. – xaxxon

ответ

2

Вы говорите о целых числах. Просто скопируйте их, оставив ссылочную нотацию, и все возможные изменения в a и b являются локальными для функции NOD. Существует две обычные причины использования ссылки. Один, вы хотите изменить их (но вам здесь не нужно). Во-вторых, иногда ссылка предлагает больше производительности, чем копия. Но здесь дело не в том, что целые числа примерно такие же дешевые, как в C/C++.

int NOD(int a, int b) { 
    if (b == 0) {return a;} 
    const int remainder = a % b; 
    return NOD(b, remainder); 
} 
-2

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

Путь к C++ может заключаться в том, чтобы обернуть int в класс, который имеет только один конструктор, который использует методы int и only const для чтения содержимого.

Если вы сделаете этот единственный конструктор недоступным для «других», то они не смогут самостоятельно создавать измененный объект.

Или вы можете вернуть выражение лямбда, которое возвращает int. Внутри компилятор будет производить экземпляр класса «на лету». По производительности это должно быть примерно одинаково, но, возможно, менее неудобно читать.

+0

Я в значительной степени согласен с тем, что ОП пытается решить проблему без проблем, но почему вниз на этом? –

+1

a) Здесь нет локальной копии. б) Функциональные языки здесь неактуальны. c) Часть о «C++ way» не мешает писать. г) Часть о лямбдах - полная глупость. – deviantfan

+0

@ DanFego, что сказал deviantfan. Ответ дает неправильное впечатление тому, кто не понимает, как работает язык или какие виды гарантий полезны. – xaxxon

-1

Ваш код вызывает Неопределенное поведение, после которого все возможно. Итак, то, что вы просите, невозможно из-за невозможности - после UB даже неизменяемые переменные изменяемы.

+0

Не применяется ли это только в том случае, если первоначальное значение было объявлено как 'const'? – user2296177

+0

@ user2296177: Действительно. Я мог бы интерпретировать «это все сломает» слишком агрессивно.Вопрос касался «неизменяемых переменных» и принимался буквально, что [не может ссылаться на 'const int & a'] (http://stackoverflow.com/a/2766109/15416). Поэтому я предположил, что 'a' был ссылкой на такую ​​неизменяемую переменную' const int Foo = 4; 'где-то. – MSalters

 Смежные вопросы

  • Нет связанных вопросов^_^