C++.Бархатный путь



Представление операций для классов. Операторные функции - часть 6


Таково, в общих чертах, объявление и определение функции. Функция без параметров.

::::: if (CDw2.operator->() == NULL) cout << "!!!" << endl; :::::

Это полная форма вызова в выражении равенства в составе условного оператора.

::::: CDw3->real = 125.07; (CDw3.operator->())->real = 125.07; :::::

Сокращённая и полная формы вызова операторной функции в составе оператора присвоения. Функция возвращает адрес, к которому применяется обычная двухместная операция косвенного обращения.

А вот более простого варианта сокращённой формы вызова функции operator->(), наподобие того, который ранее использовался в составе условного оператора, в C++ не существует. Правильно построенных выражений вида (xObject->) с единственным операндом, где -> является символом операции, в C++ нет, поскольку -> бинарная операция.

Из-за того, что не всегда удаётся различить по контексту выражение вызова функции и операцию косвенного обращения, сокращённый вызов операторной функции operator->() используется исключительно для имитации выражений с операцией косвенного обращения.

Операторная функция operator->() возвращает указатель на объект, и как любая нестатическая функция-член класса должна вызываться непосредственно "из объекта". Эта прописная истина не представляла бы никакого интереса, если бы в C++ существовали жёсткие ограничения на тип возвращаемого значения функции-члена класса. Но таких ограничений для операторных функций в C++ не существует, а потому возможны и такие экзотические варианты операторных функций:

::::: class ComplexType { ::::: }; ::::: class rrr // Объявляется новый класс. { public: ComplexType* pComplexVal; // Собственные версии конструкторов и деструкторов. rrr () { pComplexVal = new ComplexType; // Порождение собственного экземпляра объекта ComplexType. } ~rrr () { if (pComplexVal) = delete pComplexVal; } // Наконец, встроенная операторная функция. ComplexType* operator -> () { cout << "This is operator -> ()..." << endl; return pComplexVal; } }; ::::: // А это уже собственно фрагмент программы… rrr rrrVal; // Определяем объект - представитель класса rrr. cout << rrrVal ->real << " real." << endl; ::::: Сокращённая форма вызова операторной функции operator->() имеет вид rrrVal->real и интерпретируется транслятором как (rrrVal.operator->())->real, о чём и свидетельствует оператор, содержащий полную форму вызова этой операторной функции. ::::: cout << (rrrVal.operator->())->imag << " imag." << endl; :::::




Содержание  Назад  Вперед