Re[3]: Перегрузка операторов
От: Кодт Россия  
Дата: 23.05.04 10:13
Оценка: 22 (1) +1
Здравствуйте, Павел Кузнецов, Вы писали:

>> Надо сразу сказать, что перегрузка чего-либо в Си++ это только для удобства программиста, но никак не то, без чего нельзя обойтись в принципе.


ПК>Учитывая правила выбора лучшего кандидата, можно сказать, что наличие перегрузки позволяет использовать некоторые техники, которые без этого недоступны. Например, выбор лучшего алгоритма в зависимости от типа итератора, как это делается в STLport. Альтернативой этому теоретически могла бы быть частичная специализация, но выбор наиболее подходящей специализации тоже определяется через правила выбора из перегруженных функций.


Не пугай человека
Если коротко, то перегрузка функций (в том числе операторов) позволяет компилятору автоматически "дописывать" программы на произвольной глубине; без перегрузки — ВЕСЬ объём работы по выбору подходящих функций и типов перекладывается на программиста.
Пример: функция сортировки std::sort использует перегруженные операторы <, = и адресную арифметику. Без перегрузки — либо программист должен переписать этот алгоритм для каждого своего типа данных, либо передавать адреса соответствующих функций как callback-параметры. (сишная функция ::qsort принимает только сравнение, что существенно ограничивает её применение).

>> Что такое оператор? Любой? Это всего на всего некоторая фукция


ПК>Не совсем. Предопределенные операторы для встроенных типов функциями не являются. В частности, нельзя взять их адрес, они не окружены точками следования и т.п.


А конструкторы/деструкторы/присваивания POD-типов — тоже?

Наверное, имеет смысл говорить о функциях и псевдофункциях.
(Хотя такого термина и нет в Стандарте, но для единообразия можно ввести)...

>> Рассмотрим простой пример

>>
>> int a = 3;
>> int b = 5;
>> int c = a + b;
>>

>> Формально здесь задействованно 2 оператора. Оператор присваивания = и оператор сложения +.

ПК>Оператора присваивания здесь нет. Здесь есть инициализация. Это суть разные вещи.


Более корректный пример был бы
int c;
c = a + b;


>> сказать, что в некоторых случаях, компилятор может использовать оператор присваивания вместо конструктора копирования. Например как здесь.

>>
>> string a("kuku")
>> string b = a; // скорее всего соптимизируется в string b(a);
>>


ПК>Нет, оптимизация здесь ни при чем. Здесь в любом случае должен быть использован конструктор копирования (8.5/14). В частности, для string конструктор по умолчанию в данном случае не требуется, что было бы нужно, если бы стандарт предписывал использовать operator=.


Соответственно,
string b; // конструктор без параметров
b = a; // оператор присваивания
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.