Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 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)
 
Ответить с цитированием
Старый 11.04.2012, 22:35   #2
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: return и конструктор копирования

debug:
def ctor
copy ctor
operator =
==
call hfunc:
def ctor
def ctor
return
copy ctor
destroy
destroy
call hfunc:
def ctor
def ctor
return
copy ctor
destroy
destroy
operator =
destroy
msvs 11

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

Вот у холи так, как я ожидал - а вот что у меня:
def ctor
copy ctor
operator =
==
call hfunc:
def ctor
def ctor
return
destroy
call hfunc:
def ctor
def ctor
return
destroy
operator =
destroy
О УЖАС!!! Это всё GCC
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 11.04.2012, 22:46   #4
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: return и конструктор копирования

нет. это RVO
в релизе у меня тоже так
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (11.04.2012)
Старый 11.04.2012, 22:49   #5
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: return и конструктор копирования

а у меня и в debug
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 18:15.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com