Форум программистов, компьютерный форум CyberForum.ru

конструктор при возврате значения из ф-ии - C++

Восстановить пароль Регистрация
 
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
05.03.2013, 14:50     конструктор при возврате значения из ф-ии #1
В литературе написано что при возврате значения из ф-ии вызывается конструктор копирования, но в примере такого не происходит. Сначала вызывается при создании "a b;" потом для аргумента "a func(a)", и теле ф-ии при создании нового объекта "a b;" и все. Как тогда происходит возврат значения?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class a {
public:
    a() {
        std::cout << "construct" << std::endl;
    }
    a(const a& b) {
        std::cout << "copy construct" << std::endl;
    }
    a& operator = (const a& b) {
        std::cout << "copy" << std::endl;
        return *this;
    }
};
 
a func(a) {
    a b;
    std::cout << &b << std::endl;
    return b;
}
 
int main()
{
 
    a b;
    a c = func(b);
    std::cout << &c << std::endl;
    return 1;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2013, 14:50     конструктор при возврате значения из ф-ии
Посмотрите здесь:

C++ Конструктор принимающий два целочисленных значения
C++ Конструктор: задать значения переменным-членам
При возврате объекта из функции пишет, что для объекта не определен констуктор копирования C++
Вызов функции в возврате значения функции C++
Особенности использования указателей и ссылок в C++ при возврате из функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 14:57     конструктор при возврате значения из ф-ии #2
Конкретизируй вопрос. На мой взгляд, так никаких проблем нет.
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
05.03.2013, 15:02  [ТС]     конструктор при возврате значения из ф-ии #3
переменная b в функции создается в стеке который уничтожиться при завершении ее работы, как созданный объект передается в контекст ф-ии main?, вроди должен вызываться конструктор копирования в строке a c = func(b); и копировать созданный объет или это както по другому происходит ?
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
05.03.2013, 15:04     конструктор при возврате значения из ф-ии #4
так он и вызывается

вот вывод:

C
1
2
3
4
5
6
construct -   a b;
copy construct  - func(b)
construct -  a b; - уже в функции
0013FE63 - адрес b в функции
copy construct - возвращаем в значение в c, копируя обьект 
0013FF57 - и адрес с
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 15:06     конструктор при возврате значения из ф-ии #5
ага, вот:

before "a c = func(b);"

copy construct // передача по значению в функцию
construct
0042FA73
copy construct // возврат по значению из функции

after "a c = func(b);"
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
05.03.2013, 15:10  [ТС]     конструктор при возврате значения из ф-ии #6
странно у меня вот что выводит

construct
copy construct
construct
0x28fe79
0x28fe79

Process returned 1 (0x1) execution time : 0.024 s
Press any key to continue.

Добавлено через 3 минуты
компилятор наверно оптимизирует, компилил c gcc, в vc все впорядке
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 15:12     конструктор при возврате значения из ф-ии #7
так. для чистоты эксперимента, вот тебе main, его вывод дай сюда весь:

C++
1
2
3
4
5
6
7
8
9
10
int main()
{ 
    a b;
    std:: cout << "\n\n________________________\n\n";
    a c = func(b);
    std:: cout << "\n\n________________________\n\n";
    c = func(b);
    std::cout << &c << std::endl;
    return 1;
}
Добавлено через 38 секунд
Цитата Сообщение от vdvoid Посмотреть сообщение
компилятор наверно оптимизирует, компилил c gcc, в vc все впорядке
Ну да, похоже на то
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
05.03.2013, 15:16  [ТС]     конструктор при возврате значения из ф-ии #8
GCC:
---------------------------------------------
construct


________________________

copy construct
construct
0x28ff0b


________________________

copy construct
construct
0x28ff0e
copy
0x28ff0b

Process returned 1 (0x1) execution time : 0.189 s
Press any key to continue.

VS:
---------------------------------------------
construct


________________________

copy construct
construct
0026F693
copy construct


________________________

copy construct
construct
0026F693
copy construct
copy
0026F79F
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 15:21     конструктор при возврате значения из ф-ии #9
Ну ясно)

Вот вывод из студии в Release:

construct


________________________

copy construct
construct
0030F89E


________________________

copy construct
construct
0030F89F
copy
0030F89E


Вопрос исчерпан, думаю)
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
05.03.2013, 15:23     конструктор при возврате значения из ф-ии #10
так поставьте gcc флаг -O1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2013, 15:23     конструктор при возврате значения из ф-ии
Еще ссылки по теме:

почему при возврате объекта из метода исчезает поле с динамической памятью C++
Присвоение значения переменной класса через конструктор C++
Как передавать значения строкового типа в конструктор через объект класса? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.03.2013, 15:23     конструктор при возврате значения из ф-ии #11
Да ничего странного. RVO же. Чтобы увидеть все вызовы скомпилируйте с параметром -fno-elide-constuctors
Yandex
Объявления
05.03.2013, 15:23     конструктор при возврате значения из ф-ии
Ответ Создать тему
Опции темы

Текущее время: 17:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru