Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Странное поведение конструктора


Автор: fear 23.2.2010, 14:24
Кто сможет объяснить такое поведение конструктора?
Меня что-то озадачило весьма... старею похоже smile

Код

#include <iostream>

class A {
  public:
    A(const int &) {
      std::cout<<"CONSTRUCTOR()"<<std::endl;
    }
};

int main()
{
  A a1(8);
  A a2(int());
}


a1 при создании выводит в консоль строку "CONSTRUCTOR()"
a2 не выводит ничего

----
gcc version 4.2.1 (Apple Inc. build 5646)

Автор: mes 23.2.2010, 14:33
А Вы не создаете объекта во втором случае, а описываете функцию - проблема  синтаксиса smile

Автор: fear 23.2.2010, 14:44
Цитата(mes @ 23.2.2010,  14:33)
А Вы не создаете объекта во втором случае, а описываете функцию - проблема  синтаксиса smile

сможете объяснить подробнее, как так? ))

Автор: mes 23.2.2010, 14:51
Цитата(fear @  23.2.2010,  13:24 Найти цитируемый пост)
A a2(int());

это прототип функции a2.



Автор: RatHat 23.2.2010, 14:56
Вот если бы ты там написал что-то типа 

Код

#include <iostream>
class A {
  public:
    A(const int &) {
      std::cout<<"CONSTRUCTOR()"<<std::endl;
    }
};
int main()
{
  float f = 4.5;
  A a1(8);
  A a2(int(f));
}


то тогда было бы понятно. А так ты не передаёшь ему никакого фактического параметра, вот он и не отрабатывает.

Автор: mes 23.2.2010, 14:59
Цитата(RatHat @  23.2.2010,  13:56 Найти цитируемый пост)
А так ты не передаёшь ему никакого фактического параметра, вот он и не отрабатывает. 

передача "никакого фактического" параметра  тут не причем, вот не меняя "этого никакого" делаем пример работоспособным :

Код

// 1
A a2 ( (int()) );
// 2
A a2 = A( int() );

smile

Автор: fear 23.2.2010, 15:07
mes, ды вы оказывается гуру smile, не знал особенности такой, спасибо

Автор: Mephisto 23.2.2010, 15:08
Цитата(mes @  23.2.2010,  15:51 Найти цитируемый пост)
Цитата(fear @  23.2.2010,  13:24 Найти цитируемый пост)
A a2(int());

равноценно 

A a2(int);

А что в первом случае обозначают скобки?

Автор: RatHat 23.2.2010, 15:16
Ну замечательно, так в итоге ты инициализировал объект, конструктор вызвался.
При передаче параметра происходит та же инициализация, или я неправ?

Автор: mes 23.2.2010, 15:20
Цитата(Mephisto @  23.2.2010,  14:08 Найти цитируемый пост)
А что в первом случае обозначают скобки?

сорри, запарился там опечатка, исправляюсь.
равноценна
Код

A a2(int (*)()); 

т.е описание функции возвращающей A и принимающей  указатель на функцию возвращающую int .

Добавлено через 13 минут и 20 секунд
Цитата(RatHat @  23.2.2010,  14:16 Найти цитируемый пост)
Ну замечательно, так в итоге ты инициализировал объект, конструктор вызвался.
При передаче параметра происходит та же инициализация, или я неправ? 

не понял сути вопроса..

Автор: mes 23.2.2010, 15:35
Цитата(fear @  23.2.2010,  14:07 Найти цитируемый пост)
ды вы оказывается

пока нет.. я не волшебник, а только учусь © smile

Автор: RatHat 23.2.2010, 17:38
Ну ты типа написал, что, мол, передача параметров не при чём и всё такое...
В то время, как что твой вариант, что мой, имеют право на существование, ибо в обоих вариантах конструктор вызовется.
Это из сериии 
- 2+2 = 4;
- Нет!!! 2+2 тут не при чём совершенно, я на самом деле 4*1 = 4!
;)

Автор: mes 23.2.2010, 18:32
Цитата(RatHat @  23.2.2010,  16:38 Найти цитируемый пост)
что, мол, передача параметров не при чём

не передача, а
Цитата(mes @  23.2.2010,  13:59 Найти цитируемый пост)
передача "никакого фактического"

надеюсь узнаете свою фразу smile

В этой модернизации
Цитата(mes @  23.2.2010,  13:59 Найти цитируемый пост)
A a2 ( (int()) );

 не было добавлено, ничего, что могло бы считаться в Ваших терминах "каким-либо параметром",
но пример стал работоспособным, а это значит, что
Цитата(mes @  23.2.2010,  13:59 Найти цитируемый пост)
передача "никакого фактического" параметра  тут не причем,


кстати не проясните, что значит "никакой фактический параметр"  ?  smile

 smile 
Цитата(RatHat @  23.2.2010,  16:38 Найти цитируемый пост)
Это из сериии 
- 2+2 = 4;
- Нет!!! 2+2 тут не при чём совершенно, я на самом деле 4*1 = 4!

угу только "перепечатывая"  диалог, упустили в нем первую фразу :
- какой математической операцией сделать из единицы 4 ?
 smile 
 
 

Автор: RatHat 23.2.2010, 18:37
mes, для особо одарённых советую перечитать мой первый коммент, там написано: "ты НЕ передал никакого фактического параметра", а не ты "передал никакой фактический параметр". 
Если ты не понимаешь, что значит "не передал никакого фактического параметра", то я тебе сочувствую. 
Мораль, учимся читать или учим русский язык ;)
И скорее первая фраза звучала как : "я вот пытаюсь сделать 4, но у меня не получается. 3+1 работает, а по-другому не работает"

Автор: mes 23.2.2010, 19:07
Цитата(RatHat @  23.2.2010,  17:37 Найти цитируемый пост)
для особо одарённых

 избавьте меня и других форумчан, пожалуйста, от подобного рода высказываний, хоть самокритичность и хорошо, и я рад что не боитесь открыто объявить, но такие фразы неприятны сами по себе и отвлекают от темы.
 
 Умейте доказывать свое мнение, а не прятаться за словами.

Цитата(RatHat @  23.2.2010,  17:37 Найти цитируемый пост)
Мораль, учимся читать или учим русский язык ;)

Хороший вывод,  я даже помогу Вам в этом .. smile 
Начнем с 
Цитата(RatHat @  23.2.2010,  17:37 Найти цитируемый пост)
там написано: "ты НЕ передал никакого фактического параметра", а не ты "передал никакой фактический параметр". 


ну вот и объясните почему в коде
Код

A a2( int() );

НЕ передано никакого фактического параметра и НЕ РАБОТАЕТ
а в 
Код

A a2( (int()) );

также НЕ передано никакого фактического параметра и РАБОТАЕТ ?!
smile

Автор: azesmcar 24.2.2010, 08:59
Этот вопрос подробно обсуждался у Саттера, в решении сложных задач. На другом примере, но смысл тот же - тяжкое наследие Си.

Цитата

6.8 Ambiguity resolution

There is an ambiguity in the grammar involving expressionstatements and declarations: An expression statement with a functionstyle
explicit type conversion (5.2.3) as its leftmost subexpression can be indistinguishable from a declaration where the first declarator starts with a (. In those cases the statement is a declaration.


Цитата(Mephisto @  23.2.2010,  15:08 Найти цитируемый пост)
А что в первом случае обозначают скобки?

тут есть один нюанс

Код

A a2(int(k)); // это прототип A a2(int k) - тут скобки игнорируются
A a2(int()); // это прототип A a2(int (*)()); 


Цитата(RatHat @  23.2.2010,  18:37 Найти цитируемый пост)
mes, для особо одарённых советую перечитать мой первый коммент, там написано: "ты НЕ передал никакого фактического параметра"

я себя особо одаренным не считаю, но честно перечитал и так и не понял что имеется ввиду? О какой передаче фактического параметра идет речь, тут нет вызова.

Автор: RatHat 24.2.2010, 12:30
Код

A a2( (int()) );
 - даже не компилится (в Билдере, например. gcc у меня нет.) smile Так что извините, это вообще мимо, хотя возможно на gcc оно и компилится, мало ли...

Автор: azesmcar 24.2.2010, 13:28
Цитата(RatHat @  24.2.2010,  12:30 Найти цитируемый пост)
даже не компилится (в Билдере, например. gcc у меня нет.) 

а на компиляторе visual basic не пробовал? smile 

Автор: mes 24.2.2010, 13:51
Цитата(RatHat @  24.2.2010,  11:30 Найти цитируемый пост)
- даже не компилится (в Билдере, например...) smile 

ну вообще- то принято ошибку сообщать, может она у Вас совсем не по теме, а может билдер в этом тожже не соответствует стандарту.

Цитата(RatHat @  24.2.2010,  11:30 Найти цитируемый пост)
gcc у меня нет.

вместо гцц можно воспользоваться http://codepad.org, вот пример : http://codepad.org/1T7C1BOK
smile

Цитата(RatHat @  24.2.2010,  11:30 Найти цитируемый пост)
Так что извините, это вообще мимо, 

о Билдер у нас стал гарантом правильности ?!  smile тогда мимо smile


Автор: W4FhLF 24.2.2010, 14:00
RatHat, вот чего ты споришь я не пойму? Ты был неправ, признай это и не вводи людей в заблуждение. 

Автор: mes 24.2.2010, 14:16
 smile 
Цитата(W4FhLF @  24.2.2010,  13:00 Найти цитируемый пост)
признай это и вводи людей в заблуждение.  

странный призыв  smile 

Автор: W4FhLF 24.2.2010, 15:22
mes, очепятка. Был пьян, обещаю исправиться!  smile 

Автор: RatHat 24.2.2010, 18:10
W4FhLF, а почему, собственно, я был неправ? 
Я выдал свой вариант видения проблемы - я думал, человек провтыкал передачу значения в конструктор. 
Если речь в итоге шла конкретно о вызове конструктора посредством передачи именно самого типа, а не значения, то это не было указано в изначальном условии. Там вообще просто сказано: "a2 не выводит ничего". Вы поняли вопрос так, я понял иначе. И всё.

В итоге после того, как я предложил этот вариант решения проблемы (передать значение в конструктор), на меня начали гнать, типа я тупой. 
Извините, значит грамотно задавайте вопросы.

Автор: azesmcar 24.2.2010, 18:25
Цитата(RatHat @  24.2.2010,  18:10 Найти цитируемый пост)
Если речь в итоге шла конкретно о вызове конструктора посредством передачи именно самого типа, а не значения, то это не было указано в изначальном условии. 

Ты можешь передать конструктору тип? smile Только не говори о шаблонах, тут о них ни слова не написано. Это передача значения, а именно int() это есть 0. Проверь сам
Код

std::cout << int() << std::endl;

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

Автор: RatHat 24.2.2010, 18:46
azesmcar, спасибо за внятное объяснение, этого я не знал, если честно.
А тут ни у кого кроме тебя не хватило чего-то для того, чтобы сразу указать на этот нюанс.

Ошибки я признавать умею, если мне их объясняют. Сочли ошибочным - не вопрос. Но ведь никто(кроме тебя, спасибо тебе большое еще раз) не снизошёл до того, чтобы объяснить, правда ?

А начали цепляться к словам - так не вопрос, я так тоже умею.

Автор: mes 24.2.2010, 19:25
Цитата(RatHat @  24.2.2010,  17:46 Найти цитируемый пост)
А начали цепляться к словам - так не вопрос, я так тоже умею. 

я так понял это камень в мой огород, ну я могу напомнить как все было.

Вы предположили что
Цитата(RatHat @  23.2.2010,  13:56 Найти цитируемый пост)
 так ты не передаёшь ему никакого фактического параметра, вот он и не отрабатывает. 

на что получили ответ :
Цитата(mes @  23.2.2010,  13:59 Найти цитируемый пост)
передача "никакого фактического" параметра  тут не причем, вот не меняя "этого никакого" делаем пример работоспособным

после написали то,
Цитата(RatHat @  23.2.2010,  14:16 Найти цитируемый пост)
Ну замечательно, так в итоге ты инициализировал объект, конструктор вызвался.
При передаче параметра происходит та же инициализация, или я неправ?

 смысл которого я не понял о чем и сообщил :
Цитата(mes @  23.2.2010,  14:20 Найти цитируемый пост)
не понял сути вопроса..

на что получил вызывающий ответ, не основанной ни на какой предшествующей аргументации :
Цитата(RatHat @  23.2.2010,  16:38 Найти цитируемый пост)
Ну ты типа написал, что, мол, передача параметров не при чём и всё такое...
В то время, как что твой вариант, что мой, имеют право на существование, ибо в обоих вариантах конструктор вызовется.
Это из сериии 
- 2+2 = 4;
- Нет!!! 2+2 тут не при чём совершенно, я на самом деле 4*1 = 4!
;)

в ответ Вы получили уточнение насчет передачи :

Цитата

не передача, а передача "никакого фактического"

пример, показывающий где Ваше заблуждение :
Цитата


В этой модернизации
Цитата(mes @  23.2.2010,  13:59 Найти цитируемый пост)
A a2 ( (int()) );

 не было добавлено, ничего, что могло бы считаться в Ваших терминах "каким-либо параметром",
но пример стал работоспособным, а это значит, что
Цитата(mes @  23.2.2010,  13:59 Найти цитируемый пост)
передача "никакого фактического" параметра  тут не причем,


и попытка была помочь разобраться в вопросе, но для этого требовалось понять, что именно Вы подразумеваете :

Цитата

кстати не проясните, что значит "никакой фактический параметр"  ? 


ну и лишь в конце показал, что на каждую ехидную шутку можно получить ответ, и специально выделил смайлом оффтопа, чтоб в дальнейшем не отклоняться от темы :
Цитата

 smile 
Цитата

Это из сериии 
- 2+2 = 4;
- Нет!!! 2+2 тут не при чём совершенно, я на самом деле 4*1 = 4!


угу только "перепечатывая"  диалог, упустили в нем первую фразу :
- какой математической операцией сделать из единицы 4 ?


продолжение следует smile


Добавлено @ 19:38
в ответ появился некий оффтопик не очень приятной тонации :
Цитата(RatHat @  23.2.2010,  17:37 Найти цитируемый пост)
mes, для особо одарённых советую перечитать мой первый коммент, там написано: "ты НЕ передал никакого фактического параметра", а не ты "передал никакой фактический параметр". 
Если ты не понимаешь, что значит "не передал никакого фактического параметра", то я тебе сочувствую. 
Мораль, учимся читать или учим русский язык ;)
И скорее первая фраза звучала как : "я вот пытаюсь сделать 4, но у меня не получается. 3+1 работает, а по-другому не работает"



на что получили замечание о неприятности, и мое видение сказанного, также была попытка призвать к возвращению в русло темы :
Цитата(mes @  23.2.2010,  18:07 Найти цитируемый пост)
 избавьте меня и других форумчан, пожалуйста, от подобного рода высказываний, хоть самокритичность и хорошо, и я рад что не боитесь открыто объявить, но такие фразы неприятны сами по себе и отвлекают от темы.
 
 Умейте доказывать свое мнение, а не прятаться за словами.

Цитата(RatHat @  23.2.2010,  17:37 Найти цитируемый пост)
Мораль, учимся читать или учим русский язык ;)

Хороший вывод,  я даже помогу Вам в этом .. smile 
Начнем с 


После опять попзтался вернуться к вашей проблеме, и выявить место вашего заблуждения
[quote]

Цитата(mes @  23.2.2010,  18:07 Найти цитируемый пост)

ну вот и объясните почему в коде

A a2( int() );

НЕ передано никакого фактического параметра и НЕ РАБОТАЕТ
а в 
    
A a2( (int()) );

также НЕ передано никакого фактического параметра и РАБОТАЕТ ?!

ответа на этот вопрос, заметьте который нужен был не мне, а , имхо, Вам, так и не было получено и после еше нескольких незначительных и спадаюших по пылу выпадов, я  получаю :

Цитата(RatHat @  24.2.2010,  17:46 Найти цитируемый пост)

А начали цепляться к словам - так не вопрос, я так тоже умею. 

 smile  smile  smile 

Или может я чего то не правильно вижу иль не заметил ? тогда прошу ту цитату на стол. smile


Автор: fear 24.2.2010, 21:13
думаю, по текущему вопросу все ясно и дабы увести всех от бесполезного флуда, предлагаю обсудить не менее интересную задачу smile http://forum.vingrad.ru/forum/act-ST/f-92/t-292449/unread-1.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)