Управление доступом к элементам класса

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

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.

Наши рекомендации