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

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

Войти
Регистрация
Восстановить пароль
 
 
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
#1

Конструкторы и механизм return - C++

04.04.2014, 15:05. Просмотров 452. Ответов 19
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
struct M
{
    M() { cout << "1\n"; }
    M(const M&) { cout << "2\n"; }
    M& operator=(const M&) { cout << "3\n"; return *this; }
    ~M() { cout << "4\n"; }
    int a[10000];
};
 
M func()
{
    M x;
    return x; 
}
 
int main()
{
     M y = func();
}
Почему выводится 1 4? MSVS 2012
По логике, должен вызваться конструктор объекта x, этот объект вернет свою копию. Затем будет вызван копирующий конструктор объекта y. Будет вызван деструктор для x, потом для y. Может компилятор так соптимизил...

Добавлено через 19 минут
gcc тоже самое выводит
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2014, 15:05     Конструкторы и механизм return
Посмотрите здесь:

механизм наследования - C++
Есть такой код: #include &lt;iostream&gt; using namespace std; class base { protected: int i, j; // private to base, but...

Механизм перегрузки - C++
Здравствуйте, помогите решить задачу. С помощью механизма перегрузки функций организовать сложение: а) числа с самим собой (один...

Механизм перегрузки - C++
Ребят помогите. Нужно создать две версии функции, используя механимз перегрузки, заголовки у которых должны быть такими: №1 float F(float...

механизм присваивания в С++ - C++
Доброго времени суток всем. Объясните почему при присвоении создается копия присваиваемого объекта. Cat Frisky(1,2); Cat...

Механизм замещения - C++
Привет ребят! Пишу наследование. Есть базовый абстрактный класс и два производных. Написала всего одну функцию print и не получается...

Механизм итерирования - C++
доброго времени суток. наткнулся на такое задание, и ничего по нему не нашел, либо не то ищу. есть шаблонный класс реализующий множество на...

конструкторы - C++
У меня вопрос: если программа с конструкторами, то нужно ли создавать объект в программе? И по какому синтаксису вызвать функцию, описанную...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
04.04.2014, 15:07     Конструкторы и механизм return #2
в функции вызывается конструктор по-умолчанию, вы создаете y и присваеваете ему объект с конструктором по-умолчанию - отсюда 1, потом деструктор - 4
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
04.04.2014, 15:12     Конструкторы и механизм return #3
Цитата Сообщение от Dani Посмотреть сообщение
Может компилятор так соптимизил...
Да.

Добавлено через 4 минуты
Цитата Сообщение от dzrkot Посмотреть сообщение
вы создаете y и присваеваете ему объект с конструктором по-умолчанию - отсюда 1
1 из
Цитата Сообщение от dzrkot Посмотреть сообщение
в функции вызывается конструктор по-умолчанию
По поводу
Цитата Сообщение от dzrkot Посмотреть сообщение
потом деструктор - 4
Нет, потом конструктор копирования по возвращению из функции, а потом уже деструктор.
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
04.04.2014, 15:13  [ТС]     Конструкторы и механизм return #4
если уж
Цитата Сообщение от dzrkot Посмотреть сообщение
присваеваете
то должен был бы вызваться operator=
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
04.04.2014, 15:14     Конструкторы и механизм return #5
Цитата Сообщение от Dani Посмотреть сообщение
gcc тоже самое выводит
Собери без оптимизации.
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
04.04.2014, 15:14  [ТС]     Конструкторы и механизм return #6
Сейчас попробую
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
04.04.2014, 15:14     Конструкторы и механизм return #7
Цитата Сообщение от Vourhey Посмотреть сообщение
а потом уже деструктор.
имею ввиду деструктор для x. Само собой, потом деструктор для y.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
04.04.2014, 15:17     Конструкторы и механизм return #8
Скорее всего оптимизация. Если немного попытаться обмануть компилятор то все получится как положенно:
Кликните здесь для просмотра всего текста

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
#include <iostream>
using namespace std;
struct M
{
    M() { cout << "1\n"; }
    M(const M&) { cout << "2\n"; }
    M& operator=(const M&) { cout << "3\n"; return *this; }
    ~M() { cout << "4\n"; };
    M& operator+(int t) {
        r += t;
        return *this;
    }
    int r;
};
M func()
{
    M x;
    return x + 1;
}
 
int main()
{
    M y = func();
    return 0;
}
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
04.04.2014, 15:19  [ТС]     Конструкторы и механизм return #9
Цитата Сообщение от Vourhey Посмотреть сообщение
Собери без оптимизации.
А как в gcc отключить оптимизации? Вроде бы без -O2 и всяких свистелок компилю.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.04.2014, 15:19     Конструкторы и механизм return #10
Оптимизация бывает разная. Тут в частности срабатывает вот это:
http://stackoverflow.com/questions/9...al-studio-2010
Еще для поиска: no-elide-constructors
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
04.04.2014, 15:24  [ТС]     Конструкторы и механизм return #11
В студии отключил отпимизации, получилось 1 2 4 4

Добавлено через 2 минуты
А как вообще можно заставить компилятор не оптимизировать здесь? Т.е. есть проект, включена оптимизация, но в таких местах, допустим, критически важен вызов копирующего конструктора, как заставить компилятор здесь не оптимизировать?
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
04.04.2014, 15:25     Конструкторы и механизм return #12
Цитата Сообщение от Dani Посмотреть сообщение
А как вообще можно заставить компилятор не оптимизировать здесь?
У тебя в программе нет места, где был бы важен вызов копирующего конструктора, поэтому компилятор оптимизирует.
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
04.04.2014, 15:30  [ТС]     Конструкторы и механизм return #13
Vourhey, даже если я сделаю так M(const M&) { a[1] = 14; cout << "2\n"; }, все равно 1 4. Хотя тут идет важная часть (присвоение 14). Или что имеется ввиду под выражением "важная часть"?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.04.2014, 15:41     Конструкторы и механизм return #14
Цитата Сообщение от Dani Посмотреть сообщение
А как вообще можно заставить компилятор не оптимизировать здесь?
По ссылке, что я привел, написано, что для студии никак. Для gcc -fno-elide-constructors
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2014, 15:47     Конструкторы и механизм return
Еще ссылки по теме:

Конструкторы С++ - C++
Всем привет, помогите довести программу до ума :) Заранее благодарю откликнувшихся :) ...

Конструкторы - C++
Есть фрагмент кода: #include &lt;iostream&gt; using namespace std; class Counter { public: Counter operator++(int);...

Конструкторы - C++
Почему, если класс имеет конструктор с параметрами у него обязательно должен быть конструктор по умолчанию?

Конструкторы - C++
#include&lt;iostream&gt; class A { public: A(int x) : _x(x) {} private: int _x; }; int main() ...

конструкторы - C++
Доброе время суток! Помогите разобраться с конструктором. Что это такое и с чем его едят. Так как сдала лабу преподавателю, ну вроде ж...


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

Или воспользуйтесь поиском по форуму:
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
04.04.2014, 15:47  [ТС]     Конструкторы и механизм return #15
Только что запустил для gcc: получилось 1 2 4 2 4 4. То есть: в func() запускается конструктор объекта x, x копируется копирующим конструктором во временной объект, затем x удаляется, запускается копирующий конструктор для y, который копирует значения из временного объекта, затем временный объект удаляется, потом удаляется y. Правильно?
Yandex
Объявления
04.04.2014, 15:47     Конструкторы и механизм return
Ответ Создать тему
Опции темы

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