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

Ответ на вопрос - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,888
Записей в блоге: 1
17.01.2012, 13:57     Ответ на вопрос #1
Блин препод задал вопрос не знаю как ответить на него и почему такой ответ?
вот вопрос:
Какой порядок вызова методов/конструкторов?
C++
1
2
3
4
5
6
7
8
9
10
class A {
A();
A(const A&);
A& operator=(const A&);
};
 
void f(){
A a;
A b = (b = a);
}
 Комментарий модератора 
Код выделяем тегами!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
18.01.2012, 15:01     Ответ на вопрос #21
давайте перепишем
C++
1
A b = (b = a);
в псевдокод:
C++
1
A b.operator=(b.copy_ctor(a));
теперь скажите сами
Цитата Сообщение от dimcoder Посмотреть сообщение
Где именно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,688
18.01.2012, 18:43     Ответ на вопрос #22
Цитата Сообщение от retmas Посмотреть сообщение
вполне defined behavior
Холиварите со стандартом?
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
18.01.2012, 19:08     Ответ на вопрос #23
вот меня смущает то что для несконструированной переменной вызывается сначала оператор присваивания, а потом копирующий конструктор, разве это не подозрительно ???
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
19.01.2012, 02:22     Ответ на вопрос #24
Да, непонятно. copy_ctor это хорошо, конечно, но его вызывает объект b, который должен сконструироваться прежде. А происходит наоборот.

Добавлено через 7 минут
То есть я понимаю, что
C++
1
Ex b= (b = a);
Транслируется в
C++
1
Ex b(b = a);
Эффект кстати, тот же самый. И я понимаю, что прежде чем объект b сконструируется, в скобках должно что-то произойти. И вот если бы ось выкинула исключение, всё стало бы понятно, действительно b= a при отсутствии первой как-то не очень правильно.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
19.01.2012, 11:52     Ответ на вопрос #25
признаю. я был не прав и сам себя запутал.
это
C++
1
A b = (b = a);
действительно undefined behavior и даже не соответствует псевдокоду
C++
1
A b.operator=(b.copy_ctor(a));

Не по теме:

а так хотелось верить

dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
19.01.2012, 12:18     Ответ на вопрос #26
Цитата Сообщение от retmas Посмотреть сообщение
действительно undefined behavior
Приехали.
Я то уж начал убеждаться, что я не прав.
retmas
19.01.2012, 12:30
  #27

Не по теме:

Цитата Сообщение от dimcoder Посмотреть сообщение
Я то уж начал убеждаться
не идите по моему пути

lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.01.2012, 14:22     Ответ на вопрос #28
Хм. Получается, что в параметре конструктора можно использовать (вызвать метод или переменную) объект класса имени самого себя, для которого еще не применен конструктор.

Проверьте, кто-нибудь, для VS?

Must be exploitable.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
19.01.2012, 14:42     Ответ на вопрос #29
lemegeton, не знаю на счет VS, но LWS
http://liveworkspace.org/code/12f4b4...b89ff6f420384e

Хотя мой DevCpp хавает.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
19.01.2012, 14:48     Ответ на вопрос #30
Цитата Сообщение от dimcoder Посмотреть сообщение
lemegeton, не знаю на счет VS, но LWS
http://liveworkspace.org/code/12f4b4...b89ff6f420384e

Хотя мой DevCpp хавает.
просто у вас там b не обьявлена. вот http://liveworkspace.org/code/f3b12e...6b4b512ed32afe ворнинг выдает
а здесь уже даже ворнинга нет http://liveworkspace.org/code/4fb6bb...e33e605cbf4532
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
19.01.2012, 14:55     Ответ на вопрос #31
Цитата Сообщение от dimcoder Посмотреть сообщение
Хотя мой DevCpp хавает.
Там g++ версии 4.5.0 (В лучшем случае), замени:
Предлагаю людям как усовершенствовать IDE Dev-Cpp 4.9.9.2

на 4.6.1, авось хавать не будет
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
19.01.2012, 15:00     Ответ на вопрос #32
gcc 4.6.2 - жрет
vs2010 - жрет
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
19.01.2012, 15:02     Ответ на вопрос #33
4.6.1 это не жрёт:
C++
1
2
3
4
5
6
int main ()
{
   int a = 10;
   b = (b = a);
   return 0;
}
4.6.2 стабильной сборки не видел
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
19.01.2012, 15:04     Ответ на вопрос #34
Цитата Сообщение от kravam Посмотреть сообщение
4.6.1 это не жрёт:
C++
1
2
3
4
5
6
int main ()
{
   int a = 10;
   b = (b = a);
   return 0;
}
4.6.2 стабильной сборки не видел
там b не обьявлен же
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
19.01.2012, 15:09     Ответ на вопрос #35
Ну да. Ненормално то что более старые версии хавают
Ответ на вопрос

И это надо исправлять
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
19.01.2012, 15:20     Ответ на вопрос #36
и старые не схавают, просто там описка скорее всего
вопрос уже по моему не в том что выражения
C++
1
2
    A a;
    A b = (b = a);
хаваются или нет без А во 2 строке, а в том, чтоб он ругался на это A b = (b = a);

Добавлено через 1 минуту
для встроенных типов gcc выдает ворнинг, а для определенных пользователем - молчит
vs2010 молчит всегда
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,688
19.01.2012, 16:05     Ответ на вопрос #37
Цитата Сообщение от retmas Посмотреть сообщение
действительно undefined behavior
Теперь осталось довести это до сведения преподавателей.
А ведь часто и на собеседованиях задают примеры с неопределенным поведением, прося рассказать, какое будет поведение.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.01.2012, 16:39     Ответ на вопрос #38
Цитата Сообщение от Mr.X Посмотреть сообщение
А ведь часто и на собеседованиях задают примеры с неопределенным поведением, прося рассказать, какое будет поведение.
Вопросы с подвохом самые сложные. В таких случаях стоит объяснить, почему будет UB и что, по-вашему мнению, сделает известный Вам компилятор. HR'у, конечно, обычно хрен объяснишь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2012, 16:44     Ответ на вопрос
Еще ссылки по теме:

C++ Правильный ответ?
Правильный ответ? C++
Правильный ответ C++

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

Или воспользуйтесь поиском по форуму:
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
19.01.2012, 16:44     Ответ на вопрос #39
Да уж.
C++
1
2
3
4
5
6
int main ()
{
   int a = 10;
   int b = (b = a); 
   return 0;
}
Вот что значит писать второпях.

Не по теме:

C++
1
A b = (b = a);
Ох уж это быдлокодерство...

Yandex
Объявления
19.01.2012, 16:44     Ответ на вопрос
Ответ Создать тему
Опции темы

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