Цитата:
Ну так это лишнее - создавать второй объект, когда нужен один. Как записать, чтобы только вызывался конструктор?
В записи
Код:
res = Foo( x, f(x) );
необходимо четко разделять создание нового объекта и присваивание(копирование) объекту res только что созданного объекта. Боюсь, что мы углубимся в дебри, но опять подчеркну, уже в этой теме, возможность перегрузки оператора присваивания
Foo& operator=(const Foo&). Поэтому компилятор должен сначала создать новый объект, а потом выполнить
Foo.operator=, это бывает принципиально, поэтому в общем случае компилятор не может сразу так вот создавать на месте res новую инстанцию объекта Foo.
Цитата:
Ну так это лишнее - создавать второй объект, когда нужен один.
Согласен с Вами.
Цитата:
Как записать, чтобы только вызывался конструктор? Почему запись
Код:
res.Foo(x,f(x));
ошибочна?
Запись ошибочна потому, что в Си++ запрещено вызывать конструктор класса (также как и деструктор) напрямую. Они вызываются либо автоматически, как в Вашем случае приведения типов, либо с помощью операторов
new/delete при динамическом создании объектов.
Проблема Вашего класса, насколько я понял, в отсутствии, кроме конструктора, функции преобразования значений x, f(x) в объект класса Foo. Если Вы не имеете доступа к реализации класса Foo, то Вам ничего не остается, как создавать объект каждый раз заново.
От операции присваивания(копирования) объекта Foo избавиться можно, если воспользоваться методом, предложенным
maxal'ом, т.е. вместо присваивания объекта Foo другому объекту Foo можно присваивать адрес созданного объекта Foo указателю, это не ресурсоемкая операция. Однако, не рекомендую. Криво ужасно получается, деструктор где-то вызывать и т.п. Может быть, Вам стоит перекомпановать Вашу функцию, чтобы в ней уже производились какие-то полезные действия с вновьсозданным объектом, и в ней же он потом и удалялся?
Вопрос в другом - а настолько ли это принципиально? Память тут роли не играет (если у Вас конечно одна инстанция объекта не занимает половину доступной памяти
), т.к. память, отводимая под новый объект, сразу же после операции присваивания освобождается. Скорость - вот что надо оценить. Если у Вас подобные действия происходят в цикле, объект сложный, то есть смысл думать, как бы пооптимизировать. А если операция присваивания в среднем занимает, скажем, 0,1% от всего времени работы программы, то и думать над ней не нужно, пока Вы не оптимизируете более ресурсоемкие участки кода.