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




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


с точки зрения транслятора абсолютно корректна и полностью соответствует следующим прототипам:

void ComplexType::operator = (const ComplexType& ctKey); void ComplexType::operator = (ComplexType& ctKey); void ComplexType::operator = (ComplexType ctKey);

Правда, в таком случае ни о какой коммутативности, "безопасности" и эффективности вновь определяемой операторной функции нет и быть не может.

С другой стороны, уже существующий вариант нашей операторной функции также может быть оптимизирован. Функция может возвращать не ОБЪЕКТ (ЗНАЧЕНИЕ), а ССЫЛКУ на объект.

В этом случае при возвращении значения не будет создано временного объекта. Также не будет вызываться деструктор для его уничтожения. Модификация операторной функции operator=() минимальна - всего лишь дополнительная ptrОперация & в спецификации возвращаемого значения (мы приводим здесь только прототип новой версии функции): ComplexType& operator = (const ComplexType &);

Всё остальное транслятор исправит самостоятельно, так что никаких дополнительных модификаций в тексте программы производить не придётся. Эта функция будет эффективней, правда, семантика выражения её вызова будет отличаться от семантики соответствующего выражения присвоения с базовыми типами. В первом случае результатом выполнения выражения оказывается присваиваемое значение, во втором - ссылка на объект.

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

ComplexType& operator () (const ComplexType&); /* Первый вариант совместно используемой функции operator().*/ void operator () (int); /* Второй вариант совместно используемой функции operator().*/ ::::: /* Определения этих функций. Как всегда, они не делают ничего полезного… */ ComplexType& ComplexType::operator () (const ComplexType &ctKey) { cout << "This is operator (ComplexType& ctKey)..." << endl; return *this; } void ComplexType::operator () (int iKey) { cout << "This is operator ( " << iKey << " )..." << endl; } ::::: /* Полные и сокращённые формы вызова этих функций. Первая операторная функция коммутативна. */ CDw2.operator()(CDw1); CDw2(CDw1); CDw3.operator()(CDw2.operator()(CDw1)); CDw3(CDw2(CDw1)); CDw2.operator()(25); CDw2(50);




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