Управление доступом к элементам класса
Основное различие между классами С++ и структурами С состоит в правилах доступа к их элементам. Элементы структуры языка С доступны для любого выражения или функции из их области действия. В С++ имеется возможность управления правами доступа к элементам структуры, объединения или класса. Элементы класса получают атрибуты доступа либо по умолчанию, либо при использовании спецификаторов доступа, которые имеют следующие наименования и значения:
public (общий, открытый) – элемент может быть использован любой функцией;
private (частный, закрытый) – элемент доступен только методам класса и "друзьями " класса, в котором они объявлены;
protected (защищенный) – то же, что и private, однако элемент может быть использован методами и друзьями классов, производных от объявленного класса, но только в объектах производного класса.
Когда говорят о классах в С++, то включают в это понятие не только тип данных class, но также struct и union со своими правами доступа.
Для типа class все компоненты являются по умолчанию private, но можно изменить уровень доступа; для типа ctruct все компоненты по умолчанию — public, но можно изменить права доступа; для типа union все компоненты по умолчанию — public и этот уровень не может быть изменен.
Обычно ограничения на уровень доступа касаются элементов данных: как правило, данные имеют атрибут private, а методы – public. Этим ограничениям больше соответствует класс с ключевым словом class, который и используется для разработки классов в программах.
Режим доступа (по умолчанию или заданный) действует для последующих объявлений элементов класса, пока не встретится другой атрибут доступа в любом порядке, например:
class X // заголовок класса
{ int i; // private по умолчанию
char ch;
public: // общий
int j, k;
protected: // защищенный
int m;
}; // определение класса заканчивается точкой с запятой (;)
Список элементов класса
Список элементов представляет собой последовательность объявлений данных (любого типа, включая нумераторы, битовые поля и другие классы) и объявлений и определений функций, каждое из которых может иметь необязательные модификаторы доступа. Определенные таким образом объекты называют элементами (членами) класса (class members). Спецификаторы класса памяти auto, register, extern недопустимы. Элементы могут быть объявлены со спецификатором static.
Функция-элемент класса называется методом класса, а функция с модификатором friend называется дружественной функцией. Данные класса – это то, что класс "знает " (пассивная часть класса), а методы – это то, что класс "умеет делать" (активная часть).
Определение методов класса
Существует два способа включения метода в класс.
Первый способ – метод может быть определен внутри класса как встраиваемая функция с одним-двумя операторами. Компилятор осуществляет макрорасширение таких функций, снижая накладные расходы, связанные с обращением к функции и выходом из нее, например:
class Point
{ int X, Y;
int Getx() { return X; } // встроенная функция
}
Второй способ – объявление метода внутри класса в виде прототипа функции и определение метода в произвольном месте программы с помощью операции определения области действия функции ::(два двоеточия), например:
class Point
{ int X, Y;
int Getx(); // объявление метода
}
int Point :: Getx() // определение метода
{ return X; } // вне класса
Имя Point :: Getx называется полным или квалифицированным именем метода класса. В С++ разные функции могут иметь функции с одинаковыми именами. Операция :: и имя класса позволяют компилятору определить принадлежность функции конкретному классу.
Определение метода внутри класса (способ 1) не требует модификатора Point::, так как и так очевидно, что Getx принадлежит классу Point. Кроме того, модификатор Point:: перед Getx служит и другой цели. Он определяет, что переменная Х в операторе return X является собственным элементом класса Point, к которому можно обращаться непосредственно по имени.
Вывод. Тело метода Point::Getx() находится внутри области действия класса Point вне зависимости от физического расположения. Метод Getx() имеет доступ ко всем внутренним переменным класса Point.