Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
#1

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

05.03.2013, 14:50. Просмотров 619. Ответов 10
Метки нет (Все метки)

В литературе написано что при возврате значения из ф-ии вызывается конструктор копирования, но в примере такого не происходит. Сначала вызывается при создании "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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2013, 14:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос конструктор при возврате значения из ф-ии (C++):

Почему не вызывается конструктор копирования при возврате объекта из функции - C++
Добрый день! Насколько мне известно, конструктор копирования вызывается: 1) при передачи объекта как аргумента функции ...

Затираются значения при возврате из функции initializer_list - C++
Дарова. Объясните, почему при возврате объекта инитиализер_лист из функции значения этого листа трутся #include &lt;iostream&gt; using...

Особенности использования указателей и ссылок в C++ при возврате из функции - C++
Пусть у нас есть некий класс CBase и есть функция, которая создает и возвращает объект класса CBase. Создать она его может стеке или в...

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) - C++
class Test { int i; public: void test(int i) { this -&gt; i = i; } }; Конструктор Test::Test всегда вызывается...

Как избежать копирования вектора, при возврате его из функции? - C++
Вопрос простой. В классе есть поле вектор, член - данные. Методом я возвращаю его const std::vector&lt; unsigned char &gt;&amp;...

Применение std::move к локальной переменной при возврате из функции - C++
Response HostHandler::notFound() const { Response resp; resp.status = 404; return std::move(resp); } Имеет ли это...

10
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 14:57 #2
Конкретизируй вопрос. На мой взгляд, так никаких проблем нет.
0
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
05.03.2013, 15:02  [ТС] #3
переменная b в функции создается в стеке который уничтожиться при завершении ее работы, как созданный объект передается в контекст ф-ии main?, вроди должен вызываться конструктор копирования в строке a c = func(b); и копировать созданный объет или это както по другому происходит ?
0
Aloir
219 / 219 / 13
Регистрация: 17.12.2010
Сообщений: 704
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 - и адрес с
0
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);"
0
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 все впорядке
0
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 все впорядке
Ну да, похоже на то
0
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
0
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


Вопрос исчерпан, думаю)
1
XRuZzz
Антикодер
707 / 613 / 31
Регистрация: 15.09.2012
Сообщений: 2,562
05.03.2013, 15:23 #10
так поставьте gcc флаг -O1
1
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
05.03.2013, 15:23 #11
Да ничего странного. RVO же. Чтобы увидеть все вызовы скомпилируйте с параметром -fno-elide-constuctors
1
05.03.2013, 15:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2013, 15:23
Привет! Вот еще темы с ответами:

Неправильное приведения типа при возврате элемента из стандартного стека - C++
Пишет ошибку &quot;invalid type convertion&quot; в строчке #9 Cur=(Node*)s.pop(); вот и собственно весь вопрос, пробовал static_cast не помогло :/ ...

почему при возврате объекта из метода исчезает поле с динамической памятью - C++
При выходе из метода оператора + динамическая память, которая хранится в объекте класса Vector исчезает. Как исправить эту ситуацию?...

Вызов функции в возврате значения функции - C++
Есть функция: int function1(a) { ...... return function2(function1(b),function1(c)); } Как работает такая хитрая система?

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования - C++
Пишу шаблонный класс матриц. Делаю, значит, переопределение оператора + для двух матриц одного типа. Но компилятор ругается на эту функцию ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru