Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   возврат класса из функции в С++ (http://forum.oszone.net/showthread.php?t=29623)

pva 02-07-2004 14:40 204969

Я не нашёл в литературе, но посмотрев, что делает компилятор, пришёл к выводу. Меня интересует на сколько он верен.
Код:

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 204970

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


Время: 21:46.

Время: 21:46.
© OSzone.net 2001-