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

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

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

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

04.04.2014, 15:05. Просмотров 497. Ответов 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 тоже самое выводит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2014, 15:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструкторы и механизм return (C++):

В чем разница между return и return false/true - C++
Привет всем. Вот подскажите плиз) return; return false; return true; расскажите пожалуйста об етих операторах.. чем они...

Как сделать так, что если файл существует return true, если нет - return false - C++
Здравствуйте, я новичок в программировании. Мой вопрос очень прост: как сделать так, что если файл существует return true если нет return...

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

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

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

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

19
dzrkot
zzzZZZ...
522 / 352 / 53
Регистрация: 11.09.2013
Сообщений: 2,022
04.04.2014, 15:07 #2
в функции вызывается конструктор по-умолчанию, вы создаете y и присваеваете ему объект с конструктором по-умолчанию - отсюда 1, потом деструктор - 4
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
04.04.2014, 15:12 #3
Цитата Сообщение от Dani Посмотреть сообщение
Может компилятор так соптимизил...
Да.

Добавлено через 4 минуты
Цитата Сообщение от dzrkot Посмотреть сообщение
вы создаете y и присваеваете ему объект с конструктором по-умолчанию - отсюда 1
1 из
Цитата Сообщение от dzrkot Посмотреть сообщение
в функции вызывается конструктор по-умолчанию
По поводу
Цитата Сообщение от dzrkot Посмотреть сообщение
потом деструктор - 4
Нет, потом конструктор копирования по возвращению из функции, а потом уже деструктор.
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
04.04.2014, 15:13  [ТС] #4
если уж
Цитата Сообщение от dzrkot Посмотреть сообщение
присваеваете
то должен был бы вызваться operator=
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
04.04.2014, 15:14 #5
Цитата Сообщение от Dani Посмотреть сообщение
gcc тоже самое выводит
Собери без оптимизации.
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
04.04.2014, 15:14  [ТС] #6
Сейчас попробую
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
04.04.2014, 15:14 #7
Цитата Сообщение от Vourhey Посмотреть сообщение
а потом уже деструктор.
имею ввиду деструктор для x. Само собой, потом деструктор для y.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
04.04.2014, 15:17 #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;
}
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
04.04.2014, 15:19  [ТС] #9
Цитата Сообщение от Vourhey Посмотреть сообщение
Собери без оптимизации.
А как в gcc отключить оптимизации? Вроде бы без -O2 и всяких свистелок компилю.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.04.2014, 15:19 #10
Оптимизация бывает разная. Тут в частности срабатывает вот это:
http://stackoverflow.com/questions/9...al-studio-2010
Еще для поиска: no-elide-constructors
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
04.04.2014, 15:24  [ТС] #11
В студии отключил отпимизации, получилось 1 2 4 4

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

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

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

Конструкторы - C++
Объясните на пальцах, для чего нужны конструкторы?

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


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

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

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