|
Программирование >> Инициализация объектов класса, структура
ошибки компиляции: значения слева не являются l-значениями / / ошибка: терал - не l-значение 0 = 1; ошибка: арифметическое важение - не l-значение значением. Мы не можем написать следующие выражения: salary + salary * 0.10 = new salary; Оператор определения переменной выделяет для нее память. Поскольку объект имеет только одну ассоциированную с ним область памяти, такой оператор может встретиться в программе только один раз. Если же переменная, определенная в одном исходном файле, файл module0.C должна быть использована в другом, появляются проблемы. Например: определяет объект fileName string fileName; ... присвоить fileName значение файл module1.C использует объект fileName увы, не компилируется: fileName не определен в module1.C ifstream input file( fileName ); С++ требует, чтобы объект был известен до первого обращения к нему. Это вызвано необходимостью гарантировать правильность использования объекта в соответствии с его типом. В нашем примере модуль module1.C вызовет ошибку компиляции, поскольку переменная fileName не определена в нем. Чтобы избежать этой ошибки, мы должны сообщить компилятору об уже определенной переменной fileName. Это делается с файл module1.C помощью инструкции объявления переменной: использует объект fileName fileName объявляется, то есть программа получает информацию об этом объекте без вторичного его определения extern string fileName; В выражении ch = ch - 0; переменная ch находится и слева и справа от символа операции присваивания. Справа расположено значение для чтения (ch и символьный литерал 0 ): ассоциированные с переменной данные считываются из соответствующей области памяти. Слева - значение местоположения: в область памяти, соотнесенную с переменной ch, помещается результат вычитания. В общем случае левый операнд операции присваивания должен быть l- ifstream input file( fileName ) Объявление переменной сообщает компилятору, что объект с данным именем, имеющий данный тип, определен где-то в программе. Память под переменную при ее объявлении не отводится. (Ключевое слово extern рассматривается в разделе 8.2.) Программа может содержать сколько угодно объявлений одной и той же переменной, но определить ее можно только один раз. Такие объявления удобно помещать в заголовочные файлы, включая их в те модули, которые этого требуют. Так м1 можем хранить информацию об объектах в одном месте и обеспечить удобство ее модификации в случае надобности. (Более подробно о заголовочных файлах мы поговорим в разделе 8.2.) 3.2.2. Имя переменной Имя неременной, или идентификатор, может состоять из латинских букв, цифр и символа подчеркивания. Прописные и строчные буквы в именах различаются. Язык С++ не ограничивает длину идентификатора, однако пользоваться слишком длинными именами тина gosh this is an imipossibly name to type неудобно. Некоторые слова являются ключевыми в С++ и не могут быть использованы в качестве идентификаторов; в таблице 3.1 приведен их полный список. Таблица 3.1. Ключевые слова C++
Чтобы текст вашей программы был более понятным, мы рекомендуем придерживаться общепринятых соглашений об именах объектов: имя переменной обычно пишется строчными буквами, например index (для сравнения: Index - это имя тина, а INDEX - константа, определенная с помощью директивы препроцессора #define); double salary; double wage; int month; int day; int year; имени объекта и заканчивается точкой с запятой. Например: unsigned long distance; В одном операторе можно определить несколько объектов одного типа. В этом случае их имена перечисляются через запятую: double salary, wage; int month, day, year; unsigned long distance; Простое определение переменной не задает ее начального значения. Если объект определен как глобальный, спецификация С++ гарантирует, что он будет инициализирован нулевым значением. Если же переменная локальная либо динамически размещаемая (с помощью оператора new), ее начальное значение не определено, то есть она может содержать некоторое случайное значение. Использование подобных переменных - очень распространенная ошибка, которую к тому же трудно обнаружить. Рекомендуется явно указывать начальное значение объекта, по крайней мере в тех случаях, когда неизвестно, может ли объект инициализировать сам себя. Механизм классов вводит понятие конструктора по умолчанию, который служит для присвоения значений по умолчанию. (Мы уже сказали об этом в разделе 2.3. Разговор о конструкторах по умолчанию будет продолжен немного позже, в разделах 3.11 и 3.15, int main() { где м1 будем разбирать классы string и comiplex из стандартной библиотеки.) неинициазированн локальн объект int ival; объект типа string инициализирован конструктором по умолчанию string project; идентификатор должен нести какой-либо смысл, поясняя назначение объекта в программе, например: birth date или salary, если такое имя состоит из нескольких слов, как, например, birth date, то принято либо разделять слова символом подчеркивания (birth date), либо писать каждое следующее слово с большой буквы (birthDate). Замечено, что программист:, привыкшие к ОбъектноОриентированномуПодходу предпочитают выделять слова заглавными буквами, в то время как те кто много писал на С используют символ подчеркивания. Какой из двух способов лучше - вопрос вкуса. 3.2.3. Определение объекта В самом простом случае оператор определения объекта состоит из спецификатора типа и
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |