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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
#1

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

30.10.2009, 15:44. Просмотров 1160. Ответов 14
Метки нет (Все метки)

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

что будет выведено на экран - C++
7)Баллов: 1 Что будет выведено на экран в результате работы следующего программного фрагмента: char c= 'a' ; cout &lt;&lt; ( int )c;

Что будет выведено на экран? - C++
здравствуйте уважаемые программисты, вопрос следующий. что будет выведено на экран? #include &lt;stdio.h&gt; #define A(a) # a...

Что будет выведено на экран по данным указателям и ссылкам? - C++
Привет! Все никак до конца не могу понять указатели и ссылки. #include &lt;stdlib.h&gt; #include &lt;iostream&gt; using namespace std; ...

Что будет выведено на экран при выполнении следующей программы - C++
Что будет выведено на экран при выполнении следующей программы при n = 196, m = 649, k = 255 ? #include &lt;stdio.h&gt; #include...

Что будет выведено на экран при выполнении следующего фрагмента программы - C++
Помогите с заданием пожалуйстааа В программе выполнены следующие описания: class A { protected: int a; public: A(int ax){ a =...

Что будет выведено на экран при выполнении следующего фрагмента программы - C++
Пожалуйста помогите с экзаменационными заданиями((((( В программе выполнены следующие описания: class A { protected: int a; ...

14
ISergey
Maniac
Эксперт С++
1376 / 887 / 53
Регистрация: 02.01.2009
Сообщений: 2,663
Записей в блоге: 1
30.10.2009, 15:51 #2
Цитата Сообщение от rangerx Посмотреть сообщение
что будет выведено на экран?
Ни чего хорошего..
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
30.10.2009, 16:35  [ТС] #3
Ни чего хорошего..
Этот пример наглядно демонтсрирует, что в C++ всё-таки куча подводных камней.
Лично я никогда бы с первого раза не догадался почему здесь выводит то, что выводит
0
M128K145
Эксперт С++
8293 / 3513 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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) );
0
cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
30.10.2009, 16:53 #5
МоЗГ кипит
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
30.10.2009, 18:01  [ТС] #6
А так просто эта строка написана очень криво.
Ответы прошу обосновывать. В чём заключается ошибочность первого варианта, и правильность приведённого тобой?
0
M128K145
Эксперт С++
8293 / 3513 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
30.10.2009, 18:47 #7
rangerx, вызовом конструктора. Конструктор вызывается словом new, а
C++
1
bbb b_( aaa(i) );
это неявное приведение типа aaa к bbb и присвоение переменной b_ значения aaa(i), т.е. это была попытка запутать и представить неявное приведение как конструктор копирования?
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
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;
}
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
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)) );
таким образом будут вызваны оба конструктора(что казалось должно было произойти и в первом примере).
В общем, довольно таки скользкий момент.
0
ISergey
Maniac
Эксперт С++
1376 / 887 / 53
Регистрация: 02.01.2009
Сообщений: 2,663
Записей в блоге: 1
31.10.2009, 03:42 #10
Цитата Сообщение от rangerx Посмотреть сообщение
В общем, довольно таки скользкий момент.
Это скользкие руки программиста который пытается объявить прототип функции в main.
0
M128K145
Эксперт С++
8293 / 3513 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
31.10.2009, 08:35 #11
Цитата Сообщение от M128K145 Посмотреть сообщение
А так просто эта строка
C++
1
bbb b_( aaa(i) );
написана очень криво
rangerx, и после этого скажи что я был не прав.
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
31.10.2009, 14:25  [ТС] #12
M128K145, и всё-таки это кривость языка, а не кривость рук программиста. Если бы у конструктора aaa было два(и более) параметра, то никакие дополнительные скобки здесь были бы не нужны, и запись вида
C++
1
bbb b_( aaa(i, k) );
вызвала бы оба коструктора. В C++0x таких проблем вроде бы уже быть не должно.
0
M128K145
Эксперт С++
8293 / 3513 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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;
}
является кривостью языка, а не больного мозга программиста
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
31.10.2009, 17:56  [ТС] #14
rangerx, это не кривость языка, это один из нюансов языка, которыми необходимо пользоваться только в исключительных случаях.
На практике такая запись далеко не редкость.
Если каждую возможность рассматривать как кривость языка, а не рук программиста, то такой код является кривостью языка, а не больного мозга программиста
В том, что ты написал нет неоднозначности, это просто нечитабельно, собственно за это и не любят goto. Тут же дело совсем в другом.
Когда такая запись работает как надо
C++
1
bbb b_( aaa(i, k) );
а такая нет
C++
1
bbb b_( aaa(i) );
это как минимум вызывает недоумение(и не только у новичков). Поэтому, повтрюсь, момент довольно скользкий.
1
MotherBoard
Путешественница
1250 / 478 / 11
Регистрация: 22.02.2009
Сообщений: 2,843
31.10.2009, 22:50 #15
Я подозревала,что проблема именно в этой строке(cout......)
Только не знала,как исправить....
ну я же ещё не спец,а только учусь...
0
31.10.2009, 22:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2009, 22:50
Привет! Вот еще темы с ответами:

Что будет выведено на экран в результате выполнения приведенного фрагмента кода? - C++
Что будет выведено на экран в результате выполнения приведенного фрагмента кода? int n = 1; while (n&lt;=10) { if (n%2) ...

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

Что будет выведено на экран при выполнении следующей программы при n = 5 ? - C++
Пожалуйста, очень прошу помогите с тестами(( 3)Что будет выведено на экран при выполнении следующей программы при n = 5 ? ...

Что будет выведено после выполнения следующего фрагмента программы: - C++
int main() { int a = 3; int b = 4; int c = 5; int &amp;d = b; a = b = c; cout &lt;&lt; a &lt;&lt; b &lt;&lt; c &lt;&lt; d &lt;&lt;...


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

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

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