Категория: C++ энциклопедия » К
  • 0

13 дек 2011

Автор: admin

Класс в C++ — нечто большее, чем простая структура данных. Это аналог модуля из других языков программирования, средство упорядочения символьных имен.

class Foo { 
public:
static  int  y;    //  Глобальная переменная
  static void GFn();   // Глобальная функция
int  x;     //  Переменная класса
Foo();     //  Конструктор
void  Fn();    //  Функция класса
  typedef int (*IntFn)();      //  Тип
  enum Status { kOpen = 0, kClosed };  // Другой тип
struct  Bar  {    //  Вложенная структура
  int  a;
  int  b;
    static void BarFn();
}
private:
void  Hn();
};


В этом фрагменте приведены некоторые вариации на тему классов. Переменная у — глобальная переменная, a GFn() — глобальная функция, хотя область действия их имен ограничивается классом Foo. Во всех функциях класса Foo к ним можно обращаться просто по имени, но за его пределами
необходимо использовать оператор области действия :::

Foo::Foo() 
{
GFn();   //  Мы уже находимся в области действия Foo
}
void f()
{
Foo::GFn();  //  Необходимо задать область действия
}


Аналогично, определение типа IntFn, перечисление Status и даже вложенную структуру Bar также можно использовать без указания области действия в функциях класса Foo, но в любом другом месте эту область необходимо задать. Для вложенных типов с открытой видимостью синтаксис указания
области действия может принять несколько устрашающий вид, как видно из следующего примера для структуры Ваr:

Foo::Bar b; 
Foo::Bar::BarFn();


По этой причине вложенные структуры либо делаются тривиальными, либо доступ к ним ограничивается. Члены класса х, Foo и Fn(), имеют смысл лишь в контексте конкретного экземпляра (instance) этого класса. Для обращения к ним используются операторы-селекторы членов класса, . и ->. Широкие массы (и, как я выяснил на собственном горьком опыте, даже разработчики компиляторов C++) почти не знают о том, что с помощью селекторов можно вызывать статические функции класса и обращаться к статическим переменным класса. Следующий фрагмент верен, хотя бедные читатели вашей программы придут в такое замешательство, что подобное можно проделывать только в последний день перед увольнением:

Foo f; 
f.Gfn();   //  То же, что и Foo::GFn();
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.