48_______________________;_______________________Глава 1

Если в приложении создается только один объект данного класса (в нашем
примере — только один объект формы класса TFormI), то различие в основном
чисто внешнее. Для функций, объявленных в классе, в их описании к имени функ-
ции должна добавляться ссылка на класс с помощью так называемой бинарной
операции разрешения области действия (::). В нашем примере имена функций F1,
F2 и ButtonlClick в описании этих функций заменяются на TForml::Fl,
TForml::F2 и TForml::ButtonlClick. Тем самым указывается, что речь идет о фун-
кциях класса TFormI. Для функций F3 и F4, объявленных вне класса, такого до-
полнения к имени не требуется.

Необходимость добавления в имена функций, описанных в классе, ссылок на
класс объясняется просто. Вы можете вне класса описать другую свою функцию с
тем же именем (например, F1), что и у функции класса. И тогда из функций, не
описанных в классе, вы сможете ссылаться на обе эти функции F1, только на одну
из них непосредственно — по имени F1, а на другую через объект класса —
Forml::Fl. Благодаря этому, при описании своих функций вне класса вы можете
даже не знать имен всех функций, описанных в классе (может быть этот класс опи-
сан в другом модуле, текст которого вы не видели). Никакой путаницы при этом не
возникнет.

Таким образом, применение операции разрешения области действия позволя-
ет объявить в разных классах и вне классов переменные и функции с одинаковыми
именами. В этом случае операция разрешения области действия указывает, о ка-
кой именно переменной или функции идет речь. В некоторых случаях при работе с
C++Builder разрешение области действия приходится делать вручную. Это проис-
ходит в тех случаях, когда компилятор выдает сообщение, что не может выбрать
одну из нескольких альтернатив, например, не знает, к какому классу относится
указанный вами метод.

Обращение к переменным и функциям, описанным внутри и вне класса, из
функций, описанных вне класса, различается. К переменным и функциям, опи-
санным вне класса, обращение происходит просто по их именам, а к переменным и
функциям, описанным в классе, через имя объекта класса. Поэтому в нашем при-
мере в функциях F3 и F4 обращение к переменной Chl имеет вид Forml->Chl. По
той же причине и обращение к свойству Caption объекта Labell в этих функциях
имеет вид Forml->LabeIl->Caption. Только через ссылку на объект Formi внеш-
ние по отношению к классу функции могут получить доступ ко всему, объявленно-
му в классе.

Все эти ссылки на объект не требуются в функциях, объявленных в классе.
Поэтому в функциях TForml::Fl, TForml::F2 и TForml::ButtonlClick ссылки на
переменную Chl и на объект Labell не содержат дополнительных ссылок на объ-
ект формы.

Если в приложении создается несколько объектов одного класса, натоимер,
несколько форм класса TFormI (как вы увидите впоследствии, это часто делается
в приложениях с интерфейсом множества документов MDI), то проявляются более
принципиальные различия между переменными, описанными внутри и вне клас-
са. Переменные вне класса (в нашем примере Ch2 и Ch3) так и остаются в одном
экземпляре. А переменные, описанные в классе (в нашем примере Chl), тиражи-
руются столько раз, сколько объектов данного класса создано. Т.е. в каждом объ-
екте класса TFormI будет своя переменная Chl и все они друг с другом никак не
будут связаны. Таким образом, в переменную, описанную внутри класса, можно
заносить какую-то информацию, индивидуальную для каждого объекта данного
класса. А переменная, описанная в модуле вне описания класса, может хранить
только одно значение.

Отметим без детальных пояснений еще одну особенность, которую вы уже, ве-
роятно, заметили в приведенных текстах файлов. Перед именами функций-эле-
ментов класса ставится опция компилятора _fastcall. He вдаваясь в детали ска-