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

1 ... 194 195 196 [ 197 ] 198 199 200 ... 395


class Screen; class StackScreen {

int topStack;

правильно: ук

Screen *stack;

void (*handler)();

объявление

int topStack;

правильно: указатель на объект Screen Screen *stack;

ата,1 av~\

Поскольку класс не считается определенным, пока не закончилось его тело, то в нем не может быть данных-членов его собственного типа. Однако класс считается объявленным, как только распознан его заголовок, поэтому в нем допустимы члены, являющиеся

class LinkScreen { Screen window; LinkScreen *next; LinkScreen *prev;

LinkScreen

ссылками или указателями на его тип. Например: Упражнение 13.1

string name;

Пусть дан класс Person со следующими двумя членами:

string address;

Person( const string &n, const string &s )

: name( n ), address( a ) { } string name() { return name; }

и такие функции-члены:

string address() { return address; }

Какие члены вы объявили бы в секции public, а какие - в секции private? Поясните свой выбор.

Упражнение 13.2

Объясните разницу между объявлением и определением класса. Когда вы стали бы использовать объявление класса? А определение?

13.2. Объекты классов

Определение класса, например Screen, не приводит к выделению памяти. Память выделяется только тогда, когда определяется объект типа класса. Так, если имеется следующая реализация Screen:



class Screen { public:

функции-член1 private:

string screen;

string:size type cursor; short height;

short width;

то определение

Screen myScreen;

выделяет область памяти, достаточную для хранения четырех членов Screen. Имя myScreen относится к этой области. У каждого объекта класса есть собственная копия данных-членов. Изменение членов myScreen не отражается на значениях членов любого другого объекта типа Screen.

Область видимости объекта класса зависит от его положения в тексте программы. Он

class Screen {

список членов

int main() {

Screen mainScreen; определяется в иной области, нежели сам тип класса:

Тип Screen объявлен в глобальной области видимости, тогда как объект mainScreen - в локальной области функции main() .

Объект класса также имеет время жизни. В зависимости от того, где (в области видимости пространства имен или в локальной области) и как (статическим или нестатическим) он объявлен, он может существовать в течение всего времени выполнения программы или только во время вызова некоторой функции. Область видимости объекта класса и его время жизни ведут себя очень похоже. (Понятия области видимости и времени жизни введены в главе 8.)

Объекты одного и того же класса можно инициализировать и присваивать друг другу. По умолчанию копирование объекта класса эквивалентно копированию всех его членов.

Screen bufScreen = myScreen; bufScreen. height = myScreen. height; bufScreen. width = myScreen. width; bufScreen. cursor = myScreen. cursor;

Например:

bufScreen. screen = myScreen. screen;



int main()

Screen myScreen, bufScreen[10]; Screen *ptr = new Screen; myScreen = *ptr; delete ptr;

ptr = bufScreen;

Screen sref = *ptr;

Screen &ref2 = bufScreen[6];

класса могут относиться и к объекту производного от него класса.)

По умолчанию объект класса передается по значению, если он выступает в роли аргумента функции или ее возвращаемого значения. Можно объявить формальный параметр функции или возвращаемое ею значение как указатель или ссылку на тип класса. (В разделе 7.3 были представлены параметры, являющиеся указателями или ссылками на типы классов, и объяснялось, когда их следует использовать. В разделе 7.4 с этой точки зрения рассматривались типы возвращаемых значений.)

Для доступа к данным или функциям-членам объекта класса следует пользоваться соответствующими операторами. Оператор точка (.) применяется, когда операндом является сам объект или ссылка на него; а стрелка (->) - когда операндом служит

#include Screen.h

bool isEal( Screens s1, Screen *s2 )

{ возвращает false, ес объекты не равных, и true - ес равны

if (s1.height() != s2->height() s2.width() != s2->width() ) return false;

for ( int ix = 0; ix < s1.height(); ++ix ) for ( int jy = 0; jy < s2->width(); ++jy )

if ( s1.get( ix, jy ) != s2->get( ix, jy ) ) return false;

return true; попали сюда? значит, объекты равных

указатель на объект:

isEqual() - это не являющаяся членом функция, которая сравнивает два объекта Screen. У нее нет права доступа к закрытым членам Screen, поэтому напрямую обращаться к ним она не может. Сравнение проводится с помощью открытых функций-членов данного класса.

Для получения высоты и ширины экрана isEqual() должна пользоваться функциями-членами height() и width() для чтения закрытых членов класса. Их реализация тривиальна:

Указатели и ссылки на объекты класса также можно объявлять. Указатель на тип класса разрешается инициализировать адресом объекта того же класса или присвоить ему такой адрес. Аналогично ссылка инициализируется 1-значением объекта того же класса. (В объектно-ориентированном программировании указатель или ссылка на объект базового



1 ... 194 195 196 [ 197 ] 198 199 200 ... 395

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