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

1 ... 196 197 198 [ 199 ] 200 201 202 ... 395


#include <string>

void Screen::copy( const Screen ssobj ) {

этот объект и объект sobj - одно и то же,

копирование излишне

аназируем указатель this (см. раздел 13.4) if ( this != ssobj )

height = sobj. height; width = sobj. width; cursor = 0;

создаем новую строку;

ее содержимое такое же, как sobj. screen screen = aia-i oav-aan .

Например:

Хотя screen, height, width и cursor являются закрытыми членами класса Screen, функция-член copy() работает с ними напрямую. Если при обращении к члену отсутствует оператор доступа, то считается, что речь идет о члене того класса, для

#include Screen.h

int main() {

Screen s1; Установить s1

Screen s2;

s2.copy(s1); ...

которого функция-член вызвана. Если вызвать copy() следующим образом:

то параметр sobj внутри определения copy() соотносится с объектом s1 из функции main() . Функция-член copy() вызвана для объекта s2, стоящего перед оператором точка . Для такого вызова члены screen, height, width и cursor, при обращении к которым внутри определения этой функции нет оператора доступа, - это члены объекта s2. В следующем разделе мы рассмотрим доступ к членам класса внутри определения функции-члена более подробно и, в частности, покажем, как для поддержки такого доступа применяется указатель this.

13.3.3. Закрытые и открытые функции-члены

Функцию-член можно объявить в любой из секций public, private или protected тела класса. Где именно это следует делать? Открытая функция-член задает операцию, которая может понадобиться пользователю. Множество открыт1х функций-членов



class Screen {

public:

void set( const string &s ); void set( char ch );

объявления других функций-членов не изменяются пользователю модифицировать объект Screen. Добавим их объявления в тело класса:

void Screen::set( const string &s )

{ писать в строку, начиная с текущей позиции курсора

int space = remainingSpace(); int len = s.size (); if ( space < len ) {

cerr << Screen: warning: truncation:

<< space: << space

<< string length: << len << endl; len = space;

screen.replace( cursor, len, s ); cursor += len - 1;

void Screen::set( char ch )

if ( ch == \0 )

cerr << Screen: warning:

<< null character (ignored).\n ;

else screen[ cursor] = ch;

Далее следуют определения функций:

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

Представленные до сих пор функции-члены были открытыми, их можно вызывать из любого места программы, а закрытые вызываются только из других функций-членов (или

составляет интерфейс класса. Например, функции-члены home(), move () и get() класса Screen определяют операции, с помощью которых программа манипулирует объектами этого типа.

Поскольку м1 прячем от пользователей внутреннее представление класса, объявляя его члены закрытыми, то для манипуляции объектами типа Screen необходимо предоставить открытые функции-члены. Такой прием - сокрытие информации - защищает написанный пользователем код от изменений во внутреннем представлении.

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

До сих пор мы встречались лишь с функциями, поддерживающими доступ к закрытым членам только для чтения. Ниже приведены две функции set() , позволяющие



class Screen { public:

объявления других функций-членов не изменяются private:

inline int remainingSpace();

класса Screen() , использованная в set(const strings) .

inline int Screen::remainingSpace() {

int sz = width * height; return ( sz - cursor );

remainingSpace() сообщает, сколько места осталось на экране:

(Детально защищенные функции-члены будут рассмотрены в главе 17.)

Следующая программа предназначена для тестирования описанных к настоящему

#include Screen.h

#include <iostream> int main() {

Screen sobj(3,3); конструктор определен в разделе 13.3.4

string init( abcdefghi );

cout << Screen Object (

<< sobj.height() << ,

<< sobj.width() << )\n\n ;

Задать содержимое экрана string::size type initpos = 0; for ( int ix = 1; ix <= sobj.width(); ++ix

for ( int iy = 1; iy <= sobj.height(); ++iy )

sobj.move( ix, iy ); sobj.set( init[ initpos++ ] );

Напечатать содержимое экрана

for ( int ix = 1; ix <= sobj.width(); ++ix )

for ( int iy = 1; iy <= sobj.height(); ++iy )

cout << sobj.get( ix, iy ); cout << \n ;

return 0;

моменту функций-членов:

друзей) класса, но не из программы, обеспечивая поддержку другим операциям в реализации абстракции класса. Примером может служить функция-член remainingSpace



1 ... 196 197 198 [ 199 ] 200 201 202 ... 395

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