Программирование >>  Инициализация объектов класса, структура 

1 ... 192 193 194 [ 195 ] 196 197 198 ... 395


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:



1 ... 192 193 194 [ 195 ] 196 197 198 ... 395

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика