|
Программирование >> Инициализация объектов класса, структура
Майкл Тиманн (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.) Во втором наборе есть всего один оператор - взятия индекса:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |