Еще раз о конструкторах
От: Кнопка Украина  
Дата: 06.10.11 10:43
Оценка: -1 :))
имеем код:

class A
{
int a;
public:
A(int c=0):a(c)
{
std:: cout<<a<<"zz"<<endl;
};
~A(){};
};

int main()
{
A a();//A a=A();все ок
return 0;
}

как результат МV2008: warning C4930: 'A a(void)': prototyped function not called (was a variable definition intended?)

Почему не вызывается конструктор?
Re: Еще раз о конструкторах
От: zaufi Земля  
Дата: 06.10.11 10:49
Оценка: +1
Здравствуйте, Кнопка, Вы писали:

К>имеем код:

К>class A
К>{
К>    int a;
К>public:
К>    A(int c=0):a(c)
К>    {
К>        std:: cout<<a<<"zz"<<endl;
К>    };
К>    ~A(){};
К>};

К>int main()
К>{
К>    A a();
//A a=A();все ок
К>    return 0;
К>}


К>как результат МV2008: warning C4930: 'A a(void)': prototyped function not called (was a variable definition intended?)


К>Почему не вызывается конструктор?

потому что это объвление функции "a" не принимающией параметров и возвращающей экземпляр класс A
Re[2]: Еще раз о конструкторах
От: Кнопка Украина  
Дата: 06.10.11 10:57
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>Здравствуйте, Кнопка, Вы писали:


К>>имеем код:

Z>
К>>class A
К>>{
К>>    int a;
К>>public:
К>>    A(int c=0):a(c)
К>>    {
К>>        std:: cout<<a<<"zz"<<endl;
К>>    };
К>>    ~A(){};
К>>};

К>>int main()
К>>{
К>>    A a();
Z>//A a=A();все ок
К>>    return 0;
К>>}
Z>


К>>как результат МV2008: warning C4930: 'A a(void)': prototyped function not called (was a variable definition intended?)


К>>Почему не вызывается конструктор?

Z>потому что это объвление функции "a" не принимающией параметров и возвращающей экземпляр класс A

Оммм...?
A a(5); эт тоже визов функции, да?)
Re[3]: Еще раз о конструкторах
От: rg45 СССР  
Дата: 06.10.11 11:07
Оценка:
Здравствуйте, Кнопка, Вы писали:

Z>>
К>>>int main()
К>>>{
К>>>  A a();
К>>>}
Z>>


К>>>Почему не вызывается конструктор?

Z>>потому что это объвление функции "a" не принимающией параметров и возвращающей экземпляр класс A

К>Оммм...?

К>A a(5); эт тоже визов функции, да?)

А вот это уже конструирование объекта. В отличие от исходной, последняя конструкция не может трактоваться как-то иначе. Конструкция, приведенная тобой вначале может трактоваться двояко: либо как определение и инициализация объекта, либо как объявление функции. Стандарт языка предписывает разрешать эту неоднозначность в пользу второго варианта, т.е. объявления функции.
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: Еще раз о конструкторах
От: LaptevVV Россия  
Дата: 06.10.11 11:07
Оценка:
Здравствуйте, Кнопка, Вы писали:

К>Здравствуйте, zaufi, Вы писали:


Z>>Здравствуйте, Кнопка, Вы писали:


К>>>имеем код:

Z>>
К>>>class A
К>>>{
К>>>    int a;
К>>>public:
К>>>    A(int c=0):a(c)
К>>>    {
К>>>        std:: cout<<a<<"zz"<<endl;
К>>>    };
К>>>    ~A(){};
К>>>};

К>>>int main()
К>>>{
К>>>    A a();
Z>>//A a=A();все ок
К>>>    return 0;
К>>>}
Z>>


К>>>как результат МV2008: warning C4930: 'A a(void)': prototyped function not called (was a variable definition intended?)


К>>>Почему не вызывается конструктор?

Z>>потому что это объвление функции "a" не принимающией параметров и возвращающей экземпляр класс A

К>Оммм...?

К>A a(5); эт тоже визов функции, да?)
1. В первом объяснении и написано "объявление функции", а не "вызов функции".
2. Это — определение объекта а типа A с инициализацией константой 5.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Еще раз о конструкторах
От: zaufi Земля  
Дата: 06.10.11 11:08
Оценка:
Здравствуйте, Кнопка, Вы писали:

К>Здравствуйте, zaufi, Вы писали:


Z>>Здравствуйте, Кнопка, Вы писали:


К>>>имеем код:

Z>>
К>>>class A
К>>>{
К>>>    int a;
К>>>public:
К>>>    A(int c=0):a(c)
К>>>    {
К>>>        std:: cout<<a<<"zz"<<endl;
К>>>    };
К>>>    ~A(){};
К>>>};

К>>>int main()
К>>>{
К>>>    A a();
Z>>//A a=A();все ок
К>>>    return 0;
К>>>}
Z>>


К>>>как результат МV2008: warning C4930: 'A a(void)': prototyped function not called (was a variable definition intended?)


К>>>Почему не вызывается конструктор?

Z>>потому что это объвление функции "a" не принимающией параметров и возвращающей экземпляр класс A

К>Оммм...?

К>A a(5); эт тоже визов функции, да?)

ну да! конструктора )
Re[4]: Еще раз о конструкторах
От: Кнопка Украина  
Дата: 06.10.11 11:12
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Кнопка, Вы писали:


Z>>>
К>>>>int main()
К>>>>{
К>>>>  A a();
К>>>>}
Z>>>


К>>>>Почему не вызывается конструктор?

Z>>>потому что это объвление функции "a" не принимающией параметров и возвращающей экземпляр класс A

К>>Оммм...?

К>>A a(5); эт тоже визов функции, да?)

R>А вот это уже конструирование объекта. В отличие от исходной, последняя конструкция не может трактоваться как-то иначе. Конструкция, приведенная тобой вначале может трактоваться двояко: либо как определение и инициализация объекта, либо как объявление функции. Стандарт языка предписывает разрешать эту неоднозначность в пользу второго варианта, т.е. объявления функции.


Сори, не дочиталась в стандарте...
Re[4]: Еще раз о конструкторах
От: Кнопка Украина  
Дата: 06.10.11 11:14
Оценка: +1
Здравствуйте, zaufi, Вы писали:

Z>Здравствуйте, Кнопка, Вы писали:


К>>Здравствуйте, zaufi, Вы писали:


Z>>>Здравствуйте, Кнопка, Вы писали:


К>>>>имеем код:

Z>>>
К>>>>class A
К>>>>{
К>>>>    int a;
К>>>>public:
К>>>>    A(int c=0):a(c)
К>>>>    {
К>>>>        std:: cout<<a<<"zz"<<endl;
К>>>>    };
К>>>>    ~A(){};
К>>>>};

К>>>>int main()
К>>>>{
К>>>>    A a();
Z>>>//A a=A();все ок
К>>>>    return 0;
К>>>>}
Z>>>


К>>>>как результат МV2008: warning C4930: 'A a(void)': prototyped function not called (was a variable definition intended?)


К>>>>Почему не вызывается конструктор?

Z>>>потому что это объвление функции "a" не принимающией параметров и возвращающей экземпляр класс A

К>>Оммм...?

К>>A a(5); эт тоже визов функции, да?)

Z>ну да! конструктора )


Неожидано, кэп=))
Re[5]: Еще раз о конструкторах
От: licedey  
Дата: 11.10.11 11:09
Оценка:
Здравствуйте, Кнопка, Вы писали:

К>Здравствуйте, zaufi, Вы писали:


Z>>Здравствуйте, Кнопка, Вы писали:


К>>>Здравствуйте, zaufi, Вы писали:


Z>>>>Здравствуйте, Кнопка, Вы писали:


К>>>>>имеем код:

Z>>>>
К>>>>>class A
К>>>>>{
К>>>>>    int a;
К>>>>>public:
К>>>>>    A(int c=0):a(c)
К>>>>>    {
К>>>>>        std:: cout<<a<<"zz"<<endl;
К>>>>>    };
К>>>>>    ~A(){};
К>>>>>};

К>>>>>int main()
К>>>>>{
К>>>>>    A a();
Z>>>>//A a=A();все ок
К>>>>>    return 0;
К>>>>>}
Z>>>>


К>>>>>как результат МV2008: warning C4930: 'A a(void)': prototyped function not called (was a variable definition intended?)


К>>>>>Почему не вызывается конструктор?

Z>>>>потому что это объвление функции "a" не принимающией параметров и возвращающей экземпляр класс A

К>>>Оммм...?

К>>>A a(5); эт тоже визов функции, да?)

Z>>ну да! конструктора )


К>Неожидано, кэп=))


Кстати в сервис паке к студии 2010, warning по русски написан будет.
И еще кстати A *a = new A() — проходит. Также как и без скобок. Вот такой головняк с этими плюсами)
Re: Еще раз о конструкторах
От: Roman Odaisky Украина  
Дата: 11.10.11 11:55
Оценка:
Здравствуйте, Кнопка, Вы писали:

К>class A

К> A a();//A a=A();все ок

К>Почему не вызывается конструктор?


Когда нечто может быть и объявлением, и чем-то еще, оно трактуется как объявление. В случае класса можно написать и просто A a — и вызовется конструктор по умолчанию. Иногда, если нужно явно указать, что нужна инициализация без параметров — для встроенных типов int x и int x = int() дают разный результат (только второе инициализирует нулем) — приходится писать X x = X() или X x((X())), причем лишние скобки здесь обязательны, без них это снова было бы воспринято как объявление.
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.