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, то создаётся только один экземпляр класса? (есть подозрение, что это оставлено на усмотрение компилятора)
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, то создаётся только один экземпляр класса? (есть подозрение, что это оставлено на усмотрение компилятора)