Система const — одна из действительно запутанных особенностей C++. Это просто по идее, переменные, объявленные с добавлением 'const', становятся константами и не могут быть изменены программой, но так, как это нужно использовать для замены одной из отсутствующих функций C++, это становится ужасно сложным и досадно ограниченным. Следующие попытки объясняют, как используется 'const' и почему он существует. Из сочетаний указателей и «констант» постоянный указатель на переменную полезен для хранения, значение которого может быть изменено, но не перемещено в память, а указатель (постоянный или другой) полезен для возврата постоянных строк и массивов из функций, которые , так как они реализованы в виде указателей, в противном случае программа могла бы попытаться их изменить и завершить работу. Вместо трудно отследимого сбоя во время компиляции будет обнаружена попытка изменить неизменяемые значения.
Например, если функция, которая возвращает фиксированную строку «Некоторый текст», написана как
char *Function1()
{ return “Some text”;}
тогда программа может рухнуть, если она случайно попытается изменить значение, выполнив
Function1()[1]=’a’;
тогда как компилятор заметил бы ошибку, если бы исходная функция была написана
const char *Function1()
{ return "Some text";}
потому что тогда компилятор знал бы, что значение не подлежит изменению. (Конечно, компилятор теоретически мог бы это сделать в любом случае, но C не настолько умен.) Когда подпрограмма или функция вызывается с параметрами, переменные, передаваемые в качестве параметров, могут быть считаны для передачи данных в подпрограмму/функцию, записанную to, чтобы передать данные обратно в вызывающую программу, или обе, чтобы сделать и то, и другое. Некоторые языки позволяют указывать это напрямую, например, иметь типы параметров «in:», «out:» и «inout:», тогда как в C нужно работать на более низком уровне и указывать метод для передачи переменных, выбирая один что также позволяет желаемое направление передачи данных.
Например, такая подпрограмма
void Subroutine1(int Parameter1)
{ printf("%d",Parameter1);}
принимает параметр, переданный ему по умолчанию в C и C++, который является копией. Поэтому подпрограмма может прочитать значение переданной ей переменной, но не изменить его, потому что любые изменения, которые она делает, вносятся только в копию и теряются, когда подпрограмма завершается таким образом.
void Subroutine2(int Parameter1)
{ Parameter1=96;}
оставит переменную, которую она вызывала, без изменений, а не 96.
Добавление «&» к имени параметра в C++ (что было очень запутанным выбором символа, потому что «&» перед переменными в других местах C генерирует указатели!) как приводит к тому, что сама фактическая переменная, а не копия, использоваться в качестве параметра в подпрограмме и, следовательно, может быть записан для передачи данных обратно из подпрограммы. Следовательно
void Subroutine3(int &Parameter1)
{ Parameter1=96;}
установит переменную, с которой она была вызвана, равной 96. Этот метод передачи переменной как самой себя, а не копии, называется «ссылкой» в C.
Такой способ передачи переменных был дополнением C++ к C. Для передачи изменяемой переменной в оригинальном C использовался довольно сложный метод, использующий указатель на переменную в качестве параметра, а затем изменяющий то, на что он указывает. Например
void Subroutine4(int *Parameter1)
{ *Parameter1=96;}
работает, но требует, чтобы каждое использование переменной в вызываемой подпрограмме было изменено таким образом, а вызывающая подпрограмма была изменена для передачи указателя на переменную, что довольно громоздко.
Но при чем здесь «const»? Ну, есть еще одно распространенное использование для передачи данных по ссылке или указателю вместо копирования. То есть при копировании переменной будет потрачено слишком много памяти или займет слишком много времени. Это особенно вероятно с большими составными пользовательскими типами переменных («структуры» в C и «классы» в C++). Итак, объявлена подпрограмма
void Subroutine4(big_structure_type &Parameter1);
может быть использован ‘&’, потому что он собирается изменить переданную ему переменную, или это может быть просто для экономии времени копирования, и нет никакого способа определить, что это такое, если функция скомпилирована в чьей-то библиотеке. Это может быть рискованно, если нужно доверять подпрограмме, чтобы она не изменяла переменную.
Чтобы решить эту проблему, можно использовать «const» в списке параметров, например
void Subroutine4(big_structure_type const &Parameter1);
что приведет к тому, что переменная будет передана без копирования, но остановит ее изменение. Это беспорядочно, потому что, по сути, он создает метод передачи переменных только внутри из метода двусторонней передачи переменных, который сам был создан из метода передачи переменных только внутри только для того, чтобы заставить компилятор выполнить некоторую оптимизацию.
В идеале программисту не нужно контролировать эту деталь, точно определяя, как передаются переменные, просто скажите, в каком направлении идет информация, и предоставьте компилятору возможность автоматически ее оптимизировать, но C был разработан для сырого низкоуровневого программирования на гораздо менее мощных компьютерах. чем стандартны в наши дни, поэтому программист должен сделать это явно.
person
Community
schedule
29.04.2011