PDA

Показать полную графическую версию : возврат класса из функции в С++


pva
02-07-2004, 14:40
Я не нашёл в литературе, но посмотрев, что делает компилятор, пришёл к выводу. Меня интересует на сколько он верен.

struct A {
   int member1;
   int member2;
   int member3;
   A() {}
   A(int i) : member1(i), member2(i), member3(i) {}
}

class B {
public:
   const A func1()
   {
       return A(10);
   }
   const A func2()
   {
       A a;
       a.member1 = 10;
       return a;
   }

...

void test()
{
   B b;
   int i;
// 1)
   i = b.func1().member1;
   i = b.func2().member1;
// 2)
   A a1(func1());
   A a2(func2());
}

делает следующее (дебаг):
1. Создаётся экземпляр класса и из него берётся поле.
2. В первом случае выделяется память из стека test() и в ней строится объект. Во втором - строится объект в func2(), затем копируется в такой же в test(), удаляется в func2(), ну и там дальше работает.
Таким образом, если бы у объекта A был (нетривиальный) деструктор, он вызвался бы два раза (из func2 и test).

Вопрос такой: верно ли, что если функция возвращает объект, который строится в прямо в return, то создаётся только один экземпляр класса? (есть подозрение, что это оставлено на усмотрение компилятора)

ivank
02-07-2004, 15:31
Да, это разрешённая оптимищация. В su.c_cpp обсуждалось сиё много раз, в архивах, наверно и подробности найти можно.




© OSzone.net 2001-2012