Показать сообщение отдельно
Старый 11.04.2012, 22:09   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
return и конструктор копирования

Я всегда считал, что когда функция возвращает во вне автоматическую переменную по значению (не ссылкой!) при помощи оператора return, то вызывается некий механизм копирования. Соответственно возврат в вызывающий код экземпляра класса должен провоцировать вызов его конструктора копирования.
Однако если запустить этот код:
#include <conio.h>
#include <iostream>

using namespace std;

class foo{
    private:
        int bar;
    public:
        foo();
        foo(const foo &baz);
        foo &operator=(const foo &baz);
        ~foo();
        friend foo help_function(const foo &baz);
};

foo::foo():bar(0){
    cout<<"def ctor\n";
}

foo::foo(const foo &baz){
    this->bar=baz.bar;
    cout<<"copy ctor\n";
}

foo& foo::operator=(const foo &baz){
    cout<<"operator =\n";
    this->bar=baz.bar;
    return *this;
}

foo::~foo(){
    cout<<"destroy\n";
}

foo help_function(const foo &baz){
    cout<<"call hfunc:\n";
    foo temp,real_temp;
    temp.bar=baz.bar*2;
    cout<<"return\n";
    return temp;
}

int main()
{
    foo a;
    foo b=a;
    a=b;
    cout<<"==\n";
    foo c=help_function(a);
    b=help_function(a);
    getch ();
    return 0;
}
можно
Рассмотрим детальней:
foo a; вызов конструктора по умолчанию
foo b=a; вызов конструктора копирования
a=b; вызов оператора "="
тут всё логично, но далее:

foo c=help_function(a); вызов конструктора по умолчанию дважды (внутри функции поддержки), один (!) вызов деструктора и всё - далее реакция уже на следующие инструкции
b=help_function(a); вызов конструктора дважды, один деструктор, вызов оператора = и ещё одного деструктора
Это шо жа - получается, конструкция:
foo c=help_function(a);
вовсе не уничтожает автоматическую переменную foo temp, а, пользуясь тем, что всё равно требуется создание экземпляра foo c, начинает использовать temp вместо c (c становится псевдонимом temp)?
Причём в случае:
b=help_function(a);
temp всё же удаляется за ненадобностью, но уже после выполнения операции присваивания.
А печалит здесь только одно - к.к. не вызывается. Быть может зависит от настроек компилятора (gcc)?
Пользователи студии отпишитесь, пожалуйста!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием