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

Что будет выведено на экран? - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
rangerx
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,891
30.10.2009, 15:44     Что будет выведено на экран? #1
Увидел только что такую вот интересную задачку на одном форуме
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>
 
struct aaa
{
   aaa(int i)
   {
      std::cout << "aaa(int i)" << std::endl;
   }
};
 
struct bbb
{
   bbb(const aaa& _a)
   {
      std::cout << "bbb(const aaa& _a)" << std::endl;
   }
};
 
int main (int argc, char * const argv[])
{
   int i = 10;
   bbb b_( aaa(i) );
 
   return 0;
}
Вопрос: что будет выведено на экран? Просьба компилятором не пользоваться
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2009, 15:44     Что будет выведено на экран?
Посмотрите здесь:

C++ Что будет выведено на экран по данным указателям и ссылкам?
C++ что будет выведено на экран
Что будет выведено на экран при выполнении следующей программы C++
C++ Какое значение будет выведено при выполнении операторов?
то будет выведено в результате работы алгоритма? C++
Что будет выведено на экран в результате выполнения приведенного фрагмента кода? C++
C++ Что будет выведено после выполнения следующего фрагмента программы:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
30.10.2009, 15:51     Что будет выведено на экран? #2
Цитата Сообщение от rangerx Посмотреть сообщение
что будет выведено на экран?
Ни чего хорошего..
rangerx
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,891
30.10.2009, 16:35  [ТС]     Что будет выведено на экран? #3
Ни чего хорошего..
Этот пример наглядно демонтсрирует, что в C++ всё-таки куча подводных камней.
Лично я никогда бы с первого раза не догадался почему здесь выводит то, что выводит
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
30.10.2009, 16:36     Что будет выведено на экран? #4
Если бы оно было нормально написано, то было бы это
Код
aaa(int i)
bbb(const aaa& _a)
А так просто эта строка
C++
1
bbb b_( aaa(i) );
написана очень криво, поэтому и экран будет пустой. А нормально написано, это или
C++
1
new bbb ( aaa(i) );
или
C++
1
bbb* b_ = new bbb ( aaa(i) );
cristaloleg
 Аватар для cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
30.10.2009, 16:53     Что будет выведено на экран? #5
МоЗГ кипит
rangerx
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,891
30.10.2009, 18:01  [ТС]     Что будет выведено на экран? #6
А так просто эта строка написана очень криво.
Ответы прошу обосновывать. В чём заключается ошибочность первого варианта, и правильность приведённого тобой?
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
30.10.2009, 18:47     Что будет выведено на экран? #7
rangerx, вызовом конструктора. Конструктор вызывается словом new, а
C++
1
bbb b_( aaa(i) );
это неявное приведение типа aaa к bbb и присвоение переменной b_ значения aaa(i), т.е. это была попытка запутать и представить неявное приведение как конструктор копирования?
rangerx
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,891
30.10.2009, 20:46  [ТС]     Что будет выведено на экран? #8
rangerx, вызовом конструктора. Конструктор вызывается словом new, а

ты явно С++ перепутал c Java/C#
это неявное приведение типа aaa к bbb и присвоение переменной b_ значения aaa(i), т.е. это была попытка запутать и представить неявное приведение как конструктор копирования?
тебя занесло не туда И в коде из первого поста никакой кривости нет...

Подсказка:
C++
1
2
3
4
5
int main (int argc, char * const argv[])
{
    void func(int(i));
    return 0;
}
rangerx
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,891
31.10.2009, 03:37  [ТС]     Что будет выведено на экран? #9
Ладно, объясняю в чём здесь дело. А дело всё в том, что в C++ прототип функции можно объявить следующим образом
C++
1
void b( int(i) );
сделать это можно и внутри функции main
C++
1
2
3
4
5
int main (int argc, char * const argv[])
{
   void b( int(i) );
   return 0;
}
поэтому запись вида
C++
1
bbb b_( aaa(i) );
будет трактоваться как прототип функции b_ возвращающей объект типа bbb, с параметром i типа aaa.
Собственно поэтому ни один из конструкторов и не вызывается. Правильный вариант будет выглядеть так
C++
1
bbb b_( (aaa(i)) );
таким образом будут вызваны оба конструктора(что казалось должно было произойти и в первом примере).
В общем, довольно таки скользкий момент.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
31.10.2009, 03:42     Что будет выведено на экран? #10
Цитата Сообщение от rangerx Посмотреть сообщение
В общем, довольно таки скользкий момент.
Это скользкие руки программиста который пытается объявить прототип функции в main.
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
31.10.2009, 08:35     Что будет выведено на экран? #11
Цитата Сообщение от M128K145 Посмотреть сообщение
А так просто эта строка
C++
1
bbb b_( aaa(i) );
написана очень криво
rangerx, и после этого скажи что я был не прав.
rangerx
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,891
31.10.2009, 14:25  [ТС]     Что будет выведено на экран? #12
M128K145, и всё-таки это кривость языка, а не кривость рук программиста. Если бы у конструктора aaa было два(и более) параметра, то никакие дополнительные скобки здесь были бы не нужны, и запись вида
C++
1
bbb b_( aaa(i, k) );
вызвала бы оба коструктора. В C++0x таких проблем вроде бы уже быть не должно.
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
31.10.2009, 15:50     Что будет выведено на экран? #13
rangerx, это не кривость языка, это один из нюансов языка, которыми необходимо пользоваться только в исключительных случаях. Если каждую возможность рассматривать как кривость языка, а не рук программиста, то такой
код
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
 
int main()
{
    int n, i, j, *mas;
    goto a;
f:
    std::cin.get();
    goto z;
b:
    mas = new int[n];
    goto x;
q:
    mas[j] ^= mas[j + 1];   
    goto s;
k:
    for(j = 0; j < n - 1; ++j)
    {
        goto d;
s:;
    }
    goto p;
d:
    if(mas[j] > mas[j + 1])
        goto w; 
    else
        goto s;
z:
    return 0;
h:
    std::cout<<mas[i]<<' ';
    goto t;
a:
    std::cin>>n;
    goto b;
r:
    mas[j + 1] ^= mas[j];
    goto q;
c:
    std::cin.get();
    goto f;
m:
    std::cin>>mas[i];
    goto y; 
l:
    for(i = 0; i < n - 1; ++i)
    {
        goto k;
p:;
    }
    goto g;
w:
    mas[j] ^= mas[j + 1];
    goto r;
g:
    for(i = 0; i < n; ++i)
    {
        goto h;
t:;
    }
    goto c;
x:
    for(i = 0; i < n; ++i)
    {
        goto m;
y:;
    }
    goto l;
}
является кривостью языка, а не больного мозга программиста
rangerx
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,891
31.10.2009, 17:56  [ТС]     Что будет выведено на экран? #14
rangerx, это не кривость языка, это один из нюансов языка, которыми необходимо пользоваться только в исключительных случаях.
На практике такая запись далеко не редкость.
Если каждую возможность рассматривать как кривость языка, а не рук программиста, то такой код является кривостью языка, а не больного мозга программиста
В том, что ты написал нет неоднозначности, это просто нечитабельно, собственно за это и не любят goto. Тут же дело совсем в другом.
Когда такая запись работает как надо
C++
1
bbb b_( aaa(i, k) );
а такая нет
C++
1
bbb b_( aaa(i) );
это как минимум вызывает недоумение(и не только у новичков). Поэтому, повтрюсь, момент довольно скользкий.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2009, 22:50     Что будет выведено на экран?
Еще ссылки по теме:

C++ Что будет выведено на экран при выполнении следующего фрагмента программы
Что будет выведено на экран при выполнении следующего фрагмента программы C++
Что будет выведено на экран при выполнении следующей программы при n = 5 ? C++
C++ Что будет выведено на экран?
C++ Как запустить внешнее консольное приложение и получить то, что будет выведено на экран?

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

Или воспользуйтесь поиском по форуму:
MotherBoard
Путешественница
 Аватар для MotherBoard
1250 / 478 / 11
Регистрация: 22.02.2009
Сообщений: 2,843
31.10.2009, 22:50     Что будет выведено на экран? #15
Я подозревала,что проблема именно в этой строке(cout......)
Только не знала,как исправить....
ну я же ещё не спец,а только учусь...
Yandex
Объявления
31.10.2009, 22:50     Что будет выведено на экран?
Ответ Создать тему
Опции темы

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