Классы в C++ представляются ключевым словом class. Они представляют собой форму struct, у которой спецификация доступа по умолчанию –private. Таким образом, struct и class могут использоваться поочередно с соответствующей спецификацией доступа.
Следующий АТД для комплексных чисел использует struct:
struct complex
{void assign(double r, double i);
void print(){cout<
Вот эквивалентное представление, но с помощью класса:
class complex {
double real, imag;
public:
void assign(double r, double i);
void print(){cout<
Обратите внимание, что единственное отличие - в использовании ключевых слов public и private. Возможно также такое написание:
class complex
{private: // один из способов сделать его явным
double real, imag;
public:
void assign(double r, double i);
void print(){cout<
Это наш стиль - отдавать предпочтение class по отношению к struct, при условии, что все члены не должны обрабатываться как publiс.
Область видимости класса
Класс добавляет новый набор правил контекста к правилам базового языка (см. раздел 3.8). Одно из предназначений классов - обеспечение технологии инкапсуляции. Концептуально имеет смысл, чтобы все имена, объявленные внутри класса, обрабатывались внутри их собственного пространства имен, отлично от любых внешних имен, имен функций или имен прочих классов. Это создает потребность в операторе разрешения контекста.
Оператор разрешения контекста : :
Оператор разрешения контекста — новый в C++, и является оператором с самым высоким приоритетом в языке. Он применяется в двух формах:
::i //одноместный оператор - ссылается на
//внешний контекст
foo bar::i //двухместный оператор - ссылается на
//контекст класса
Одноместная форма используется для раскрытия или обращения к имени, относящемуся ко внешнему контексту и скрытому локальным контекстом или контекстом класса.
int count = 0; //внешняя переменная void how many(double w[], double x, int& count)
{for (int i = 0; i < Ы; ++i)
count += (w[i] == x);
++::count; //следят за обращениями
}
Двухместная форма используется для устранения неоднозначности имен, которые повторно используются внутри классов. Подобное его применение будет существенно при наследовании (см. главу 9).
class wicigets {public: void f();};
class gizmos {public: void f();};
void f() { / *что угодно* /) //обычно внешняя f
void widgets::f(){/* что угодно*/}//f локальная для widgets
void gizmos::f(){/* что угодно*/} //f локальная для gizmos
Одна из точек зрения на использование оператора разрешения контекста состоит в том, чтобы рассматривать его как обеспечение маршрута к идентификатору. По умолчанию внешний маршрут отсутствует. Это аналогично тому, как работают структурные каталоги при именовании файлов.
Внутри самого определения класса или при использовании его с селекторами члена для вызова функций-членов это свойство имени обычно не нужно, как видно в продолжении предыдущего примера:
>
widgets w;
gizmos g;
g.f() ;
w.f();
g.gizmos::f(); //допустимо и избыточно
g.widgets::f(); //неверно: widgets::f() не может
//действовать на gizmos
Похожие записи
No user прокомментировали сообщение
Оставить комментарий