![]() |
|
Программирование >> Инициализация объектов класса, структура
creens Screen::display() typedef string::size type idx type; for ( idx type ix = 0; ix < height; ++ix ) { для каждой строки idx type offset = width * ix; смещение строки for ( idx type iy = 0; iy < width; ++iy ) для каждой колонки вывести элемент cout << screen[ offset + iy ]; cout << endl; return *this; объявление reSize() находится в теле класса в нем задан аргумент по умолчанию bkground = # лп г Cav~aan . . v~aCi а / т.г aav- KVarv-aTmn, Screen::reSize( int h, int w, char bkgroun { сделать высоту экрана равной h, а ширину - равной w запомнить содержимое экрана string local( screen); заменить строку screen screen.assign( записать в строку h * w, h * w символов bkground со значением bkground typedef string::size type idx type; idx type local pos = 0; скопировать содержимое старого экрана в новый for ( idx type ix = 0; ix < height; ++ix ) { для каждой строки idx type offset = w * ix; смещение строки for ( idx type iy = 0; iy < width; ++iy ) для каждой колонки присвоить новое значен screen[ offset + iy ] = local[ local pos++ height = h; width = w; cursor не меняется return *this; А вот реализация reSize (): Работа указателя this не исчерпывается возвратом объекта, к которому была применена функция-член. При рассмотрении copy() в разделе 13.3 мы видели и другой способ его использования: void Screen::copy( const Screens sobj ) { если этот объект Screen и sobj - одно и то же, копирование изне if ( this != sobj ) { скопировать значение sobj в this Указатель this хранит адрес объекта, для которого была вызвана функция-член. Если адрес, на который ссылается sobj, совпадает со значением this, то sobj и this относятся к одному и тому же объекту, так что операция копирования не нужна. (Мы еще встретимся с этой конструкцией, когда будем рассматривать копирующий оператор присваивания в разделе 14.7.) Упражнение 13.7 Указатель this можно использовать для модификации адресуемого объекта, а также для его замены другим объектом того же типа. Например, функция-член assign() класса classTypeS classType::assign( const classType ssource ) { if ( this != Ssource ) { this->~classType(); new (this) classType( source ); return *this; classType выглядит так. Можете ли вы объяснить, что она делает? Напомним, что ~classType - это имя деструктора. Оператор new выглядит несколько причудливо, но м1 уже встречались с подобным в разделе 8.4. Как вы относитесь к такому стилю программирования? Безопасна ли эта операция? Почему? 13.5. Статические члены класса Иногда нужно, чтобы все объекты некоторого класса имели доступ к единственному глобальному объекту. Допустим, необходимо подсчитать, сколько их было создано; глобальным может быть указатель на процедуру обработки ошибок для класса или, скажем, указатель на свободную память для его объектов. В подобных случаях более эффективно иметь один глобальный объект, используемый всеми объектами класса, чем отдельные члены в каждом объекте. Хотя такой объект является глобальным, он существует лишь для поддержки реализации абстракции класса. В этой ситуации приемлемым решением является статический член класса, который ведет себя как глобальный объект, принадлежащий своему классу. В отличие от других членов, которые присутствуют в каждом объекте как отдельные элементы данных, статический член существует в единственном экземпляре и связан с самим типом, а не с конкретным его объектом. Это разделяемая сущность, доступная всем объектам одного класса. class Account { расчетный счет Account( double amount, const string sowner ); string owner() { return owner; } private: static double interestRate; процентная ставка double amount; сумма на счету string owner; владелец interestRate объявлен как закрытый и статический типа double: }; Почему interestRate сделан статическим, а amount и owner нет? Потому что у всех счетов разные владельцы и суммы, но процентная ставка одинакова. Следовательно, объявление члена interestRate статическим уменьшает объем памяти, необходимый для хранения объекта Account. Хотя текущее значение interestRate для всех счетов одинаково, но со временем оно может изменяться. Поэтому мы решили не объявлять этот член как const. Достаточно модифицировать его лишь один раз, и с этого момента все объекты Account будут видеть новое значение. Если бы у каждого объекта была собственная копия, то пришлось бы обновить их все, что неэффективно и является потенциальным источником ошибок. В общем случае статический член инициализируется вне определения класса. Его имя во внешнем определении должно быть специфицировано именем класса. Вот так можно явная инициализация статического члена класса #include account.h инициализировать interestRate: double Account:: interestRate = 0.0589; В программе может быть только одно определение статического члена. Это означает, что инициализацию таких членов следует помещать не в заголовочные файлы, а туда, где находятся определения невстроенных функций-членов класса. В объявлении статического члена можно указать любой тип. Это могут быть константные объекты, массивы, объекты классов и т. д. Например: По сравнению с глобальным объектом у статического члена есть следующие преимущества: статический член не находится в глобальном пространстве имен программ:, следовательно, уменьшается вероятность случайного конфликта имен с другими глобальными объектами; остается возможность сокрытия информации, так как статический член может быть закрытым, а глобальный объект - никогда. Чтобы сделать член статическим, надо поместить в начале его объявления в теле класса ключевое слово static. К ним применимы все правила доступа к открытым, закрытым и защищенн1м членам. Например, для определенного ниже класса Account член
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |