|
Программирование >> Инициализация объектов класса, структура
#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
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |