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

1 ... 232 233 234 [ 235 ] 236 237 238 ... 395


Майкл Тиманн (Michael Tiemann), автор компилятора GNU С++, предложил назвать это расширение языка именованным возвращаемым значением (return value language extension). Его точка зрения изложена в работе [. В нашей книге Inside the С++ Object Model ([LIPPMAN96a]) приводится детальное обсуждение затронутых в этой главе тем.



15.1. Перегрузка операторов

В предыдущих главах мы уже показывали, что перегрузка операторов позволяет программисту вводить собственные версии предопределенных операторов (см. главу 4) для операндов типа классов. Например, в классе String из раздела 3.15 задано много перегруженных операторов. Ниже приведено его определение:

15. Перегруженные операторы и определенные пользователем

преобразования

В главе 15 мы рассмотрим два вида специальных функций: перегруженные операторы и определенные пользователем преобразования. Они дают возможность употреблять объекты классов в выражениях так же интуитивно, как и объекты встроенных типов. В этой главе мы сначала изложим общие концепции проектирования перегруженных операторов. Затем представим понятие друзей класса со специальными правами доступа и обсудим, зачем они применяются, обратив особое внимание на то, как реализуются некоторые перегруженные операторы: присваивание, взятие индекса, вызов, стрелка для доступа к члену класса, инкремент и декремент, а также специализированные для класса операторы new и delete. Другая категория специальных функций, которая рассматривается в этой главе, - это функции преобразования членов (конвертеры), составляющие набор стандартных преобразований для типа класса. Они неявно применяются компилятором, когда объекты классов используются в качестве фактических аргументов функции или операндов встроенных или перегруженных операторов. Завершается глава развернутым изложением правил разрешения перегрузки функций с учетом передачи объектов в качестве аргументов, функций-членов класса и перегруженных операторов.



#include <iostream>

class String;

istreams operator>>( istream s, const String s ); ostreams operator<<( ostream s, const String s );

class String { public:

набор перегруженн конструкторов для автоматической инициализации

String( const char* = 0 String( const String s );

деструктор: автоматическое уничтожение ~String();

набор перегруженн операторов присваивания Strings operator=( const String s ); Strings operator=( const char * );

перегруженный оператор взятия индекса abav~r av-Tav~aav~ г 1 / .+

chars operator[]( int ); набор перегруженн операторов равенства

str1 == str2;

bool operator==( const char * ); bool operator==( const String s );

функции доступа к членам

int size() { return size; }; char * c str() { return strin

private:

char * c str() { return string; }

int size; char * string;

классе String есть три набора перегруженных операторов. Первый - это набор

набор перегруженн операторов присваивания Strings operator=( const String s );

операторов присваивания:

Strings operator=( const char * );

Сначала идет копирующий оператор присваивания. (Подробно они обсуждались в разделе 14.7.) Следующий оператор поддерживает присваивание С-строки символов

String name; объекту типа String:

name = Sherlock ; использование оператора operator=( char * )

(Операторы присваивания, отличн1е от копирующих, mi рассмотрим в разделе 15.3.) Во втором наборе есть всего один оператор - взятия индекса:



1 ... 232 233 234 [ 235 ] 236 237 238 ... 395

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