Здравствуйте Гарин Георгий, Вы писали:
ГГ>Здравствуйте Андрей Тарасевич, Вы писали:
АТ>>>"Лишние" вызовы конструкторов и деструкторов возникают в частности из за того, что ты передаешь объекты в оператор '+' по значению. Это приводит к созданиям промежуточных объектов-копий. Это совершенно не нужно. Предевать следует константные ссылки:
АТ>>>polynom polynom::operator=(const polynom&); АТ>>>polynom polynom::operator+(const polynom&);
АТ>>Еще одно уточнение: оператор '+' не модифицирует своего левого операнда, поэтому соответствующий метод следует объявить как константный:
АТ>>polynom polynom::operator=(const polynom&); АТ>>polynom polynom::operator+(const polynom&) const; ГГ> И не создавать временный объект, что-ли, т.е. писать this->.... = this-> ... + что-то ГГ> return*this ГГ> Так?
Не так. Временный объект тебе создавать придется — ты же где-то должен получить результат, а this изменять не верно, т.к. это operator +, а не operator += (да и как тут было справедливо замечено его правильно было бы объявить как const).
ГГ> А как быть со вторым вопросом? ГГ> polynom a(2),b(2),*c ГГ> c=a*b — это можно сделать и как?
Можно.
[code]
polinom* polinom::operator*(const polinom&) const
{
polinom* res = new polinom;
...
какой-то код
...
return res;
}
[\code]
Только на мой взляд не нужно (но это из серии "О вкусах не спорят").
Да, а чего я действительно не понял, так это зачем класс polinom делать наследником класса copmlex? Он по-моему к нему никаких родственных отношений не имеет.
И еще одна мелочь: деструктор класса наследника необязательно объявлять virtual, если он объявлен в базовом классе как virtual. Не лениво лишний раз по клавишат бить?