// ошибка: арифметическое выражение - не 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;
ifstream input_file( fileName )
Объявление переменной сообщает компилятору, что объект с данным именем, имеющий данный тип, определен где-то в программе. Память под переменную при ее объявлении не отводится. (Ключевое слово extern рассматривается в разделе 8.2.)
Программа может содержать сколько угодно объявлений одной и той же переменной, но определить ее можно только один раз. Такие объявления удобно помещать в заголовочные файлы, включая их в те модули, которые этого требуют. Так мы можем хранить информацию об объектах в одном месте и обеспечить удобство ее модификации в случае надобности. (Более подробно о заголовочных файлах мы поговорим в разделе 8.2.)
3.2.2. Имя переменной
Имя переменной, или идентификатор, может состоять из латинских букв, цифр и символа подчеркивания. Прописные и строчные буквы в именах различаются. Язык С++ не ограничивает длину идентификатора, однако пользоваться слишком длинными именами типа gosh_this_is_an_impossibly_name_to_type неудобно.
Некоторые слова являются ключевыми в С++ и не могут быть использованы в качестве идентификаторов; в таблице 3.1 приведен их полный список.
Таблица 3.1. Ключевые слова C++
asm | auto | bool | break | case |
catch | char | class | const | const_cast |
continue | default | delete | do | double |
dynamic_cast | else | enum | explicit | export |
extern | false | float | for | friend |
goto | if | inline | int | long |
mutable | namespace | new | operator | private |
protected | public | register | reinterpret_cast | return |
short | signed | sizeof | static | static_cast |
struct | switch | template | this | throw |
typedef | true | try | typeid | typename |
union | voidunion | using | virtual | void |
Чтобы текст вашей программы был более понятным, мы рекомендуем придерживаться общепринятых соглашений об именах объектов:
* имя переменной обычно пишется строчными буквами, например index (для сравнения: Index – это имя типа, а INDEX – константа, определенная с помощью директивы препроцессора #define);
* идентификатор должен нести какой-либо смысл, поясняя назначение объекта в программе, например: birth_date или salary;
если такое имя состоит из нескольких слов, как, например, birth_date, то принято либо разделять слова символом подчеркивания (birth_date), либо писать каждое следующее слово с большой буквы (birthDate). Замечено, что программисты, привыкшие к ОбъектноОриентированномуПодходу предпочитают выделять слова заглавными буквами, в то время как те_кто_много_писал_на_С используют символ подчеркивания. Какой из двух способов лучше – вопрос вкуса.
3.2.3. Определение объекта
В самом простом случае оператор определения объекта состоит из спецификатора типа и имени объекта и заканчивается точкой с запятой. Например:
double salary;
double wage;
int month;
int day;
int year;
unsigned long distance;