|
Программирование >> Инициализация объектов класса, структура
class First { int memi; double memd; class Second { int memi; double memd; class First obj1; Second obj2 = obj1; ошибка: obj1 и obj2 имеют разните тип1 Тело класса определяет отдельную область видимости. Объявление членов внутри тела помещает их имена в область видимости класса. Наличие в двух разных классах членов с одинаковыми именами - не ошибка, эти имена относятся к разным объектам. (Подробнее об областях видимости классов мы поговорим в разделе 13.9.) После того как тип класса определен, на него можно ссылаться двумя способами: написать ключевое слово class, а после него - имя класса. В предыдущем примере объект obj1 класса First объявлен именно таким образом; указать только имя класса. Так объявлен объект obj2 класса Second из приведенного примера. Оба способа сослаться на тип класса эквивалентны. Первый заимствован из языка C и остается корректным методом задания типа класса; второй способ введен в C++ для упрощения объявлений. 13.1.1. Данные-члены Данные-члены класса объявляются так же, как переменные. Например, у класса Screen width ) положение на экране #include <string> class Screen { string screen; string( height string::size type cursor; текущее поло ен short height; число строк short width; число колонок могут быть следующие данные-члены: Поскольку мы решили использовать строки для внутреннего представления объекта класса Screen, то член screen имеет тип string. Член cursor - это смещение в строке, он применяется для указания текущей позиции на экране. Для него использован переносим1й тип string::size type. (Тип size type рассматривался в разделе 6.8.) Необязательно объявлять два члена типа short по отдельности. Вот объявление класса Screen, эквивалентное приведенному выше: class Screen { * screen адресует строку размером height * width * cursor указает текущую позицию на экране * height и width - соответственно число строк и колонок string screen; string::size type cursor; short height, width; class StackScreen { int topStack; void (*handler)(); указатель на функцию vector<Screen> stack; вектор классов Член класса может иметь любой тин: }; Описанные данные-члены называются нестатическими. Класс может иметь также и статические данные-члены. (У них есть особые свойства, которые мы рассмотрим в разделе 13.5.) Объявления данных-членов очень похожи на объявления переменных в области видимости блока или пространства имен. Однако их, за исключением статических class First { int memi = 0; ошибка double memd = 0.0; ошибка членов, нельзя явно инициализировать в теле класса: }; Данные-члены класса инициализируются с помощью конструктора класса. (Мы рассказывали о конструкторах в разделе 2.3; более подробно они рассматриваются в главе 14.) 13.1.2. Функции-члены Пользователям, по-видимому, понадобится широкий набор операций над объектами типа Screen: возможность перемещать курсор, проверять и устанавливать области экрана и рассчитывать его реальные размеры во время выполнения, а также копировать один объект в другой. Все эти операции можно реализовать с помощью функций-членов. Функции-члены класса объявляются в его теле. Это объявление выглядит точно так же, как объявление функции в области видимости пространства имен. (Напомним, что глобальная область видимости - это тоже область видимости пространства имен. Глобальн1е функции рассматривались в разделе 8.2, а пространства имен - в разделе 8.5.) Например: class Screen { public: void home(); void move( int, int ); char get(); char get( int, int ); void checkRange( int, int ); ... class Screen { public: определения функций home() и get() void home() { cursor = 0; } char get() { return screen[ cursor]; get() { return ... Определение функции-члена также можно поместить внутрь тела класса: }; home() перемещает курсор в левый верхний угол экрана; get() возвращает символ, находящийся в текущей позиции курсора. Функции-члены отличаются от обычных функций следующим: функция-член объявлена в области видимости своего класса, следовательно, ее имя не видно за пределами этой области. К функции-члену можно обратиться с помощью ptrScreen->home(); одного из операторов доступа к членам - точки (.) или стрелки (->): myScreen.home(); (в разделе 13.9 область видимости класса обсуждается более детально); функции-члены имеют право доступа как к открытым, так и к закрытым членам класса, тогда как обычным функциям доступны лишь открытые. Конечно, функции-члены одного класса, как правило, не имеют доступа к данным-членам другого класса. Функция-член может быть перегруженной (перегруженные функции рассматриваются в главе 9). Однако она способна перегружать лишь другую функцию-член своего класса. По отношению к функциям, объявленным в других классах или пространствах имен, функция-член находится в отдельной области видимости и, следовательно, не может перегружать их. Например, объявление get(int, int) перегружает лишь get() из того же класса Screen:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |