Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
...компилятор сам создаст конструктор по умолчанию" Интересует мнение форумчан, насколько эта каноническая фраза вообще корректна? Преподавая ООП, я вижу, что она сбивает с толку студентов, и считаю, что она не только не соответствует физической действительности, но и чисто с точки зрения обучения вредна, вызывает такие ассоциации, мол, можно не писать конструктор, компилятор его сам создаст.. Итак, 1. Если в классе объявлены конструкторы (хотя бы один), то это предписывает способы создания объекта. Нет среди них дефолтного конструктора - создавать объекты без параметров нельзя. Это логично, что объявлением конструкторов мы описываем как можно и как нельзя создавать объекты. 2. Если в классе нет ни одного конструктора, то его объекты можно создавать - и это правильно, в С++ нет обязательных методов, класс может быть вообще пустым (иногда это полезно). Но ПОЧЕМУ п.2 приравнивается к "будет создан конструктор по умолчанию"? В чем проявляется его "созданность"? Фактически, в этом случае у класса просто нет конструктора, но его объекты можно создавать - просто не срабатывает никакой конструктор. Никто поля не проинициализирует за программиста. Кто-то может предположить, что работает единый механизм: компилятор создает функцию, на которую идет переход при каждом создании объекта. Если в классе нет конструкторов, то функция все равно создается и вызывается, только она пустая. Да, это действительно было бы "компилятор создает конструктор". Но это не так! Если в классе нет конструктора, то при создании объекта ничего не вызывается, нет никакого мифического "конструктора, созданного компилятором". Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. И вуаля: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 06:54 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
Я думаю ни в одном языке стандарт не имеет такой авторитет и не является настолько ревностно защищаемым и продуманным как в С++. И употребленное вами слово "канонический" в своем изначальном значении здесь очень точно. Так говорит стандарт: "Если нет объявленного пользователем конструктора по умолчанию, будет неявно объявлен конструктор без параметров, и он будет описан как "функция-член по умолчанию (std - defaulted member-function)". В некоторых случаях неявно объявленный конструктор может быть помечен как удаленный (то есть конструктора без параметров фактически нет, и им нельзя никоим образом воспользоваться), все эти случаи так же рассмотрены стандартом. То есть "запрещение" конструктора без параметров тоже делается через механизм неявного объявления конструктора без параметров. То есть не все так просто с этим механизмом как у вас представлено. Что касается доводов относительно его "тривиальности (std)". В указанном вами случае конструктор тривиален, и этот случай подходит под те пункты стандарта которые описывают в каких ситуациях неявно объявленный конструктор по умолчанию без параметров будет тривиальным. Нужно понимать что приведи вы хоть тысячу примеров, это не даст вам возможности твердо перейти к закономерности. А у вас единичный пример. В стандарте указано точно - в остальных случаях данный конструктор будет не тривиальным. Конструктор бппу тривиален при соблюдении всех следующих условий одновременно: Класс не имеет виртуальных функций и виртуальных базовых классов, все родители класса имеют тривиальные конструкторы, для всех членов класса которые сами являются классами существуют тривиальные конструкторы по умолчанию. Иначе конструктор бппу не тривиален. Например: Код: plaintext 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. Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 09:53 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
Может быть я не до конца понял Вашу мысль, особенно про тривиальность класса (при чем тут она). как именно это: sherzod_Так говорит стандарт: "Если нет объявленного пользователем конструктора по умолчанию, будет неявно объявлен конструктор без параметров, и он будет описан как "функция-член по умолчанию (std - defaulted member-function)". фактически проявлено? Если в пустом классе конструктор объявлен компилятором (хоть и неявно), это говорит о том, что он СУЩЕСТВУЕТ. Каким способом можно убедиться в этом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 10:06 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpaceМожет быть я не до конца понял Вашу мысль, особенно про тривиальность класса (при чем тут она). как именно это: sherzod_Так говорит стандарт: "Если нет объявленного пользователем конструктора по умолчанию, будет неявно объявлен конструктор без параметров, и он будет описан как "функция-член по умолчанию (std - defaulted member-function)". фактически проявлено? Если в пустом классе конструктор объявлен компилятором (хоть и неявно), это говорит о том, что он СУЩЕСТВУЕТ. Каким способом можно убедиться в этом? Почему вы привели отрывок? Дальше ведь идут уточнения о том что этот конструктор может стать тривиальным, а может быть и удален. Чтобы убедиться что конструктор создан просмотрите ассемблерный код приведенного мной примера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 10:13 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
sherzod_, хм.. спасибо, покопаю ассемблер, т.е. все-таки для trivial будет создан конструктор, вызывающий конструкторы полей. Хотя стоп, я бы все-таки не назвал это конструктором класса trivial по умолчанию. Конструкторы предков и полей вызываются автоматически В ЛЮБОМ конструкторе класса, явно объявленном, это просто механизм, который гарантирует, что при создании объекта отработают явно заданные конструкторы предков и полей. Но какое это имеет отношение к конструктору непосредственно самого класса trivial? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 10:24 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 07:54 AM, TopSpace wrote: > Автор: TopSpace. ...компилятор сам создаст конструктор по умолчанию" > Интересует мнение форумчан, насколько эта каноническая фраза вообще корректна? Некорректна. Конструкторов два, умолчательный и копирования. Они каждый создаются или нет компилятором по своим правилам. > Преподавая ООП, я вижу, что она сбивает с толку студентов, и считаю, что она не > только не соответствует физической действительности, но и чисто с точки зрения > обучения вредна, вызывает такие ассоциации, мол, можно не писать конструктор, > компилятор его сам создаст.. Конечно неверная. > Но ПОЧЕМУ п.2 приравнивается к "будет создан конструктор по умолчанию"? В чем > проявляется его "созданность"? Блин, в том, что он будет создан. Будет существовать такая функция, её можно будет ЯВНО вызывать, даже она может иметь адрес, и всегда имеет вполне конкретный код. А именно -- вызов всех конструкторов виртуальных баз в порядке объявления в списке наследования, вызов всех конструкторов невиртуальных баз в порядке объявления в списке наследования, затем вызов всех конструкторов членов класса в порядке объявления в классе. Ну и ещё инициализируется указатель на таблицу виртуальных методов, если такая есть. Фактически, в этом случае у класса просто нет > конструктора, но его объекты можно создавать - просто не срабатывает никакой > конструктор. Никто поля не проинициализирует за программиста. Проинициализирует. Кстати это принципиально. > Кто-то может предположить, что работает единый механизм: компилятор создает > функцию, на которую идет переход при каждом создании объекта. Так именно и происходит. Если в классе нет > конструкторов, то функция все равно создается и вызывается, только она пустая. Она не пустая. > Да, это действительно было бы "компилятор создает конструктор". Но это не так! > Если в классе нет конструктора, то при создании объекта ничего не вызывается, > нет никакого мифического "конструктора, созданного компилятором". Это абсолютно неверно. Это верно только для так называемых POD-структур. Это классы, не имеющие ни одного предка или мембера нуждающихся в конструировании. и не имеющие виртуальные методы. > 00D915CE lea ecx,[f1] > 00D915D1 call Foo1::Foo1 (0D911AEh)// Для f1 реально вызывается конструктор, хотя в Release может не будет и этого > \tFoo2 f2;// А здесь даже при отключенной оптимизации НЕ ВЫЗЫВАЕТСЯ НИЧЕГО, покуда вызывать просто нечего. Потому что твой класс -- это POD-структура. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 10:39 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 07:54 AM, TopSpace wrote: > Преподавая ООП, я вижу, что она сбивает с толку студентов, и считаю, что она не > только не соответствует физической действительности, но и чисто с точки зрения > обучения вредна, вызывает такие ассоциации, мол, можно не писать конструктор, > компилятор его сам создаст.. Если ты реально преподаёш ООП, в частности, С++, то я тебе настойчиво рекомендую прочитать стандарт языка. Это трудно и муторно, но всё же надо. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 10:41 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 10:53 AM, sherzod_ wrote: > Так говорит стандарт: "Если нет объявленного пользователем конструктора по > умолчанию, Не хочется сейчас копать стандарт, но условие другое -- если ВООБЩЕ НИ ОДНОГО конструктора явно не объявлено. будет неявно объявлен конструктор без параметров, и он будет описан > как "функция-член по умолчанию (std - defaulted member-function)". Ну и не только объявлен, но и определён. > Класс не имеет виртуальных функций и виртуальных базовых классов, все родители > класса имеют тривиальные конструкторы, для всех членов класса которые сами > являются классами существуют тривиальные конструкторы по умолчанию. Иначе > конструктор бппу не тривиален. Блин, таки придётся лезть в стандарт... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 10:44 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 11:24 AM, TopSpace wrote: > хм.. спасибо, покопаю ассемблер, т.е. все-таки для trivial будет создан > конструктор, вызывающий конструкторы полей. Стандарт надо копать, а не ассемблер. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 10:47 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
MasterZivПроинициализирует. Кстати это принципиально. ээ.. в смысле? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 10:58 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 11:58 AM, TopSpace wrote: > Проинициализирует. Кстати это принципиально. > ээ.. в смысле? > > > class Foo > { > int x; > }; > > int main() > { > Foo f;// в f.x лежит мусор У f.x нет конструктора, был бы -- проинициализировался бы и f.x Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 11:20 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
MasterZiv, я кажется понял причины своего вопроса) В моем понимании, конструктор - это тот метод, который обеспечивает инициализацию всех полей объекта. Он и называется соответствующе: его задача привести объект к "рабочему" состоянию, чтобы в нем не осталось не инициализированных полей. Это я про концептуальное понимание говорю, не про стандарт языка. Вот в этом смысле компилятор не "создает конструктор по умолчанию". То, о чем говорилось в постах выше - это механизм автоматического вызова конструкторов базовых классов и полей объекта. Тем более, что У f.x нет конструктора, был бы -- проинициализировался бы и f.x - не совсем так. Почему Код: plaintext 1. - это вызов конструктора по умолчанию, а Код: plaintext 1. - нет? Та же семантика, тот же смысл операции, int() вернет ноль, поэтому было бы логично, чтобы в f.z тоже записался бы ноль (как делается в C#). Вот тогда это был бы действительно "конструктор создается компилятором", и его реально можно не писать, возлагая эту задачу на компилятор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 12:10 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpaceПочему Код: plaintext 1. - это вызов конструктора по умолчанию, а Код: plaintext 1. - нет?Потому что int (в C++) не есть класс. (Для сравнения, в C# int есть класс, и там правила для int и Foo во многом будут единообразны.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 12:18 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
Abstraction, справедливо. И не поспоришь ни с чем, с одной стороны. С другой, не покидает меня это ощущение, что "конструктор создаваемый компилятором" не совсем конструктор, ибо простые поля объекта он не трогает, а фраза подобная усыпляет бдительность неофитов (мол, можно ничего не писать - сами поля занулятся). Видимо, причина подобных казусов в том, что С++ - это "переходный" язык, от процедурного к ООП, т.к. в нем еще не соблюдается (как в C# и Java) правило "все есть класс". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 12:30 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 01:10 PM, TopSpace wrote: > В моем понимании, конструктор - это тот метод, который обеспечивает > инициализацию всех полей объекта. Он и называется соответствующе: его задача > привести объект к "рабочему" состоянию, чтобы в нем не осталось не > инициализированных полей. Это я про концептуальное понимание говорю, не про > стандарт языка. Зачем нам какое-то другое понимание что такое конструктор, вместо стандартного ? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 12:50 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 01:30 PM, TopSpace wrote: > справедливо. И не поспоришь ни с чем, с одной стороны. С другой, не покидает > меня это ощущение, что "конструктор создаваемый компилятором" не совсем > конструктор, ибо простые поля объекта он не трогает, а фраза подобная усыпляет > бдительность неофитов (мол, можно ничего не писать - сами поля занулятся). > Видимо, причина подобных казусов в том, что С++ - это "переходный" язык, от > процедурного к ООП, т.к. в нем еще не соблюдается (как в C# и Java) правило "все > есть класс". Бред полный. "Не совсем конструктор" и "переходный язык" -- особенно. В Java тоже не "всё есть класс". За что он неоднократно критиковался. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 12:52 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
MasterZiv, вам стандарт дороже элементарной логики? 1. Конструктор - это метод, который предназначен для инициализации полей объекта (в т.ч. простых, для int - нули)/ 2. Если нет конструкторов, компилятор сам создаст конструктор по умолчанию. Не нужно быть знатоком Аристотелевской логики, чтобы заключить, что выводом в этой цепочке будет 3. Значит я могу объявить класс без единого конструктора, и его поля (в т.ч. простые) будут проинициализированы. А это не так. Почему - уже разобрались. В C# это так, отсюда я и сказал про "переходность". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 13:00 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 02:00 PM, TopSpace wrote: > вам стандарт дороже элементарной логики? нет, логика и прописана в стандарте. > 1. Конструктор - это метод, который предназначен для инициализации полей объекта > (в т.ч. простых, для int - нули)/ Нет, конструктор -- это метод, предназначенный для инициализации объекта класса. У класса вообще может не быть полей, но инициализация должна произойти. > 3. Значит я могу объявить класс без единого конструктора, и его поля (в т.ч. > простые) будут проинициализированы. Не будут в общем случае. > > А это не так. Почему - уже разобрались. В C# это так, отсюда я и сказал про > "переходность". Ну, С# -то тут при чём ? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 13:43 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
MasterZiv, C# при том, что по сравнению с С++ он более полно воплощает концепцию ООП. Т.е. это практически чистый ООП-язык, а С++ одной ногой в процедурном подходе С, другой - в мире ООП. Отсюда и такие несуразности. Я не объявил конструкторы, компилятор создаст к-р по умолчанию сам, ожидаемо (исходя из самой концепции конструктора!), что он проведет какую-то инициализацию. Да, вызовет к-ры предков и полей - но почему не всех? Почему он оставит не проинициализированными поля простого типа, не смотря на то, что компилятор, вообще-то, "знает" какие у них значения по умолчанию (int() вернет 0, double() вернет 0.0)? В C# это работает именно так: не объявил конструкторы? Да пожалуйста, мусора в полях объекта гарантированно все равно не останется, т.е. реально отрабатывает код, заносящий нули не только в поля этого объекта. Вот это я понимаю "компилятор создал конструктор по умолчанию автоматически", соответствие задаче 100%. А в С++ половину проинициализирует, половину нет (простые типы). Я уже не раз видел, как студенты трактуют эту каноническую фразу как необязательность конструктора, и как следствие - они получают мусор в простых полях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 13:58 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpaceMasterZiv, C# при том, что по сравнению с С++ он более полно воплощает концепцию ООП. Т.е. это практически чистый ООП-язык, а С++ одной ногой в процедурном подходе С, другой - в мире ООП. Отсюда и такие несуразности. Я не объявил конструкторы, компилятор создаст к-р по умолчанию сам, ожидаемо (исходя из самой концепции конструктора!), что он проведет какую-то инициализацию. Да, вызовет к-ры предков и полей - но почему не всех? Почему он оставит не проинициализированными поля простого типа, не смотря на то, что компилятор, вообще-то, "знает" какие у них значения по умолчанию (int() вернет 0, double() вернет 0.0)? В C# это работает именно так: не объявил конструкторы? Да пожалуйста, мусора в полях объекта гарантированно все равно не останется, т.е. реально отрабатывает код, заносящий нули не только в поля этого объекта. Вот это я понимаю "компилятор создал конструктор по умолчанию автоматически", соответствие задаче 100%. А в С++ половину проинициализирует, половину нет (простые типы). Я уже не раз видел, как студенты трактуют эту каноническую фразу как необязательность конструктора, и как следствие - они получают мусор в простых полях.Бросьте плюсы, займитесь C#. Все станет гораздо проще. Если вы на таком уровне понимания, и с таким нежеланием признать ошибки в толковании с вольным додумыванием, еще и критикуете язык (самый верный способ перестать понимать предмет еще больше), то что ожидать от студентов-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 14:18 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpaceДа, вызовет к-ры предков и полей - но почему не всех? Почему он оставит не проинициализированными поля простого типа, не смотря на то, что компилятор, вообще-то, "знает" какие у них значения по умолчанию (int() вернет 0, double() вернет 0.0)? Это сделано для совместимости со структурами С. А в С это нужно, потому что это язык низкого уровня, и если программисту потребуется инициализация, то он укажет ее явно, а иначе не зачем тратить ресурсы на ее проведение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 14:24 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
sherzod_, для каждой задачи свой инструмент, я вышел из возраста "какой язык лучше". Какая критика? Я отметил, что C# более объектно-ориентирован, чем С++ - Вы с этим не согласны? Додумывания нет, я просто смотрю на вопрос с дидактической точки зрения, и вижу, что эта фраза больше путает, чем поясняет. Ведь это не я ее пишу - ко мне приходят студенты с ошибками, прочитав ее в одной из книг (где она встречается повсеместно, и часто без пояснений подробностей). Вы думаете я не понимаю, что без конструктора простые поля сами не проинициализируются? Тут вопрос принципа, хочется видеть правильные формулировки. Элементарную логическую цепочку из 3 шагов я привел выше - оспорьте, если желаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 14:32 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpacesherzod_, для каждой задачи свой инструмент, я вышел из возраста "какой язык лучше". Какая критика? Я отметил, что C# более объектно-ориентирован, чем С++ - Вы с этим не согласны? Додумывания нет, я просто смотрю на вопрос с дидактической точки зрения, и вижу, что эта фраза больше путает, чем поясняет. Ведь это не я ее пишу - ко мне приходят студенты с ошибками, прочитав ее в одной из книг (где она встречается повсеместно, и часто без пояснений подробностей). Вы думаете я не понимаю, что без конструктора простые поля сами не проинициализируются? Тут вопрос принципа, хочется видеть правильные формулировки. Элементарную логическую цепочку из 3 шагов я привел выше - оспорьте, если желаете.В вашей логической цепочке 1, 3 утверждения не верные, вам же сказали уже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 14:36 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
> C# при том, что по сравнению с С++ он более полно воплощает концепцию ООП. Т.е. > это практически чистый ООП-язык, а С++ одной ногой в процедурном подходе С, > другой - в мире ООП. Всё, дальше можешь не продолжать этот бред. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 14:40 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, да, логично. Посмотрел кстати здесь: конструктор по умолчанию . В C++ и Java если нет явным образом опредёленных конструкторов в классе, то компилятор использует конструктор по умолчанию, опредёленный неявным способом, который аналогичен «чистому» конструктору по умолчанию. Казалось бы мелочь, но смысл уже немного другой. Компилятор создает "чистый" конструктор по умолчанию - вот это точное определение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 14:42 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Вы не утруждаете себя пояснять свои оскорбления? Т.е. чисто авторитарный подход. Ну ок, закроем тему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 14:43 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 03:32 PM, TopSpace wrote: > Какая критика? Я отметил, что C# более объектно-ориентирован, чем С++ - Вы с > этим не согласны? Ты сначала возьми все языки. Определи метрику для объектно-ориентированости, чтобы соотнести языки с множеством действительных чисел по этому критерию. Вычисли для всех рассматриваемых языков эту метрику, и тогда уже заявляй, что какой-то язык более объектно-ориентированый, чем другой, преподаватель блин, тоже мне. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 14:43 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
MasterZiv, не надо мудрствовать лукаво, все проще. WIKIPEDIAОбъе́ктно-ориенти́рованное, или объектное, программи́рование (в дальнейшем ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов. В C# кроме классов, по сути, других строительных единиц кода нет. В С++ функции и данные могут существовать вне классов, как в языке С. Из этого не следует, что C# более объектно-ориентирован? Если для вас нет - вперед, проводите свои исследования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 14:51 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpaceMasterZiv, не надо мудрствовать лукаво, все проще."Световодозвуконепроницаемость! Вот что я говорю!" Вы используете термин "более объектно-ориентирован", не раскрывая его значения. WikiОбъе́ктно-ориенти́рованное, или объектное, программи́рование (в дальнейшем ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.Ergo, C++ суть язык, совместимый с объектно-ориентированной парадигмой программирования. Больше из этого определения ничего не следует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 15:05 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 03:51 PM, TopSpace wrote: > WIKIPEDIA > Объе́ктно-ориенти́рованное, или объектное, программи́рование (в дальнейшем ООП) — > парадигма программирования, в которой основными концепциями являются понятия > объектов и классов. Класс -- основная концепция языка С++. Ну и что дальше ? (кстати они в определении слили в одну чашку объектные и объектно-ориентированные языки, так что ты можешь ещё помедитировать на счёт того, что более объектное -- CLIPPER или Smalltalk). > В C# кроме классов, по сути, других строительных единиц кода нет. > В С++ функции и данные могут существовать вне классов, как в языке С. В C# и яве есть примитивы. Они только пакуются-распаковываются по требованию автоматически, но по сути объектами не являются. > Из этого не следует, что C# более объектно-ориентирован? Неа. (даже если бы это было так). Из этого вообще ничего не следует. Если для вас нет - > вперед, проводите свои исследования. А я ничего не заявлял. что мне доказывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 15:08 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
MasterZivКласс -- основная концепция языка С++. Ну и что дальше ? Основная, но не единственная, С++ поддерживает парадигму процедурного программирования, C# - нет. Я не думал, что нужно пояснять что значит ОО. Если простым языком, то это решение задач в понятиях объектов, а не процедур. C# просто не позволит решить задачу минуя объекты, С++ - запросто. Вот еще линк: Чисто объектно-ориентированные и гибридные языки Среди наших четырех языков, только Java и C# являются чистыми ОО языками (как Eiffel и Smalltalk).... ...C++ и Object Pascal, наоборот, - типичные примеры гибридных языков, которые позволяют программистам использовать при необходимости традиционный подход C или Pascal. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 15:19 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpaceC# просто не позволит решить задачу минуя объекты, С++ - запросто. Гм. Код: c# 1. 2. 3. Кто найдёт хоть один объект? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 15:35 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpaceПосмотрел кстати здесь: конструктор по умолчанию . В C++ и Java если нет явным образом опредёленных конструкторов в классе, то компилятор использует конструктор по умолчанию, опредёленный неявным способом, который аналогичен «чистому» конструктору по умолчанию. Казалось бы мелочь, но смысл уже немного другой. Компилятор создает "чистый" конструктор по умолчанию - вот это точное определение. На самом деле правило чуть сложнее. 1) Если в классе нет явных конструкторов по умолчанию и имеются только члены POD типов или структуры содержащие только POD и без явных конструкторов то компилятор создает неявный конструктор который инициализирует всю структуру нулями. Но вызывать этот конструктор он будет только если создаваемый объект имеет явный инициализатор. Таким образом Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 2) Если же у класса есть явный конструктор, то именно на него возлагается обязанность указать инициализаторы для POD членов класса . Этот конструктор вызывается даже если у объекта нет инициализатора, но если в нем не указаны инициализаторы для POD членов то они останутся неинициализированными. Т.е: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 3) Если у класса нет конструктора и смесь членов POD и не-POD (т.е классов с конструкторами), то неявный конструктор создается, вызывается в любом случае, но вызывает конструкторы по умолчанию только у не-POD членов. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Т.е. не-POD данные всегда иницализируются каким либо конструктором, а для иницализации POD-данных всегда требуется указывать явные инициализаторы, кроме единственного исключения - структура состоящая исключительно из POD данных, без конструктора, создаваемый объект которой имеет иницализатор. Во всех остальных случаях у вас будут неиницализированные POD данные (сейчас не рассматриваем статическую память, где все сначала нулями иницализируется, а потом уже применяются выше приведенные правила) По моему достаточно просто запомнить. К поддержке ООП это вообще не имеет отношения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 15:41 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
Друзья, спасибо всем за участие, вы реально открыли для меня новое в таком, казалось бы простом вопросе. Извините, если кого-то задел. Anatoly Moskovsky, спасибо за примеры! Не знаю почему, но в первом из них у меня в g.x все-таки "мусор"... Может зависит от компилятора, или Debug\Release? Смотрел в MS VS 2010 Ultimate (Console, Debug). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 18:36 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpaceAnatoly Moskovsky, спасибо за примеры! Не знаю почему, но в первом из них у меня в g.x все-таки "мусор"... Может зависит от компилятора, или Debug\Release? Смотрел в MS VS 2010 Ultimate (Console, Debug). Если вы создаете структуру так Foo f; (без инициализатора) то там и должен быть мусор. Я ж написал в коментариях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 18:45 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, не, я как раз про пример Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. У меня в обоих объектах x остается с мусором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 19:22 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpaceAnatoly Moskovsky, не, я как раз про пример Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. У меня в обоих объектах x остается с мусором. Как проверяли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 19:31 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 08:22 PM, TopSpace wrote: > не, я как раз про пример > > class Foo > { > int x; > }; > > int main() > { > Foo f;// в f.x лежит мусор > Foo g = Foo();// и в g.f тоже! > return 0; > } > > > > У меня в обоих объектах x остается с мусором. и должен быть мусор. Foo -- это POD. У него нет конструктора, и члены никак не инициализируются. В С++ есть генеральный принцип постоения языка -- no overhead. Если тебе не нужна какая-то функциональность в языке, и ты её не используешь, то ты гарантировано получишь 0 накладных расходов. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 19:53 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, ну как, breakpoint и watch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 20:03 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
MasterZivи должен быть мусор. Foo -- это POD. У него нет конструктора, и члены никак не инициализируются. Вы ошибаетесь. Foo() создает инициалированную нулями структуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 20:12 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpaceAnatoly Moskovsky, ну как, breakpoint и watch Распечатайте в коде. Дебаггер может все что угодно показывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 20:17 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
TopSpace...компилятор сам создаст конструктор по умолчанию" Ты не видишь разницы между конструктором и инициализатором. Отсюда и все твои проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 21:15 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyРаспечатайте в коде. Дебаггер может все что угодно показывать. Плиин... и правда.. кто бы мог подумать. Заносит ноль. Все, снимаю все свои возражения, каноническая фраза действительно соответствует правде, просто она требует разъяснения нюансов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 21:37 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
On 06/26/2012 04:19 PM, TopSpace wrote: > Основная, но не единственная, С++ поддерживает парадигму процедурного > программирования, C# - нет. C# тоже поддерживает парадигму процедурного программирования. > Среди наших четырех языков, только Java и C# являются чистыми ОО языками (как > Eiffel и Smalltalk).... > ...C++ и Object Pascal, наоборот, - типичные примеры гибридных языков, Смотри. Я занимаюсь программированием. Значит я -- программист, так ? Я также например играю на гитаре. Значит я -- гитарист. Так ? Ещё я катаюсь на сноуборде, значит я - сноубордист, и так далее. Также и тут -- Если в языке есть свойства поддержки ООП -- значит это объектно-ориентированный язык. Если в языке есть поддержка процедургого программирования -- это процедурный язык. Если есть поддержка функционального программирования -- это функциональный язык. и так далее. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 11:52 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
MasterZiv, да я не спорю, что оба они (C++ и C#) - мультипарадигменные языки. То, что C# более объектно ориентирован, мне показалось в ходе такой истории. Студенты изучают сначала чистый С, где в т.ч. знакомятся с алгоритмами, это как основа. Потом идет курс ООП, и тут дилемма. Многие хотят учить C#, как более "модный", современный, и удобный для быстрой разработки. Понять их можно, им же и диплом потом писать, и эквивалентный результат в области окошек, чтения файлов, коннекта к базе и т.п. - на .net сделать быстрее, проще (хоть и в ущерб пониманию "как это работает"). Прикол в том, что даже чтобы написать Hello, world! приходится сразу же столкнуться с: 1. понятие класс 2. понятие метода 3. понятие статического метода (для Main). А С++ плавно вытекает и С, тот же main, в начале (как во многих книгах) отличия С++ от С (new, перегрузка функций, ссылки, и т.п.), и только потом классы - получается очень плавно. У них еще действуют привычки от С, типа int вместо bool, глобальные функции. А c# более строго приучает к ОО-стилю. Он просто не даст написать программу без использования хотя бы одного класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 12:45 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
> да я не спорю, что оба они (C++ и C#) - мультипарадигменные языки. То, что C# > более объектно ориентирован, мне показалось в ходе такой истории. Нет "более" или "менее". Прикол в том, что даже чтобы написать Hello, > world! приходится сразу же столкнуться с: > 1. понятие класс > 2. понятие метода > 3. понятие статического метода (для Main). Да ? printf("Hellow, word!\n"); > А С++ плавно вытекает и С, тот же main, в начале (как во многих книгах) отличия > С++ от С (new, перегрузка функций, ссылки, и т.п.), и только потом классы - > получается очень плавно. У них еще действуют привычки от С, типа int вместо > bool, глобальные функции. А c# более строго приучает к ОО-стилю. Он просто не > даст написать программу без использования хотя бы одного класса. А оно надо ? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 15:50 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
MasterZivПрикол в том, что даже чтобы написать Hello, > world! приходится сразу же столкнуться с: > 1. понятие класс > 2. понятие метода > 3. понятие статического метода (для Main). Да ? printf("Hellow, word!\n"); Имелось в виду, в случае C#, по всей видимости. Там же любая (не являющаяся делегатом) функция, включая точку входа, должна быть в каком-нибудь классе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 17:21 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
Ну тогда System.out.println("Hellow, World!"); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 17:30 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
MasterZivНу тогда System.out.println("Hellow, World!"); System.Console.WriteLine("Hellow, World!"); ? Так а ГДЕ это написать? В С++ можно в int main. В C# придется объявить класс, а в нем - public static void Main. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 18:40 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
White OwlTopSpace...компилятор сам создаст конструктор по умолчанию" Ты не видишь разницы между конструктором и инициализатором. Отсюда и все твои проблемы. А можна немного поподробнее? ну или ссыль где курить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 17:37 |
|
||
|
"Если в классе не объявлены конструкторы, то...
|
|||
|---|---|---|---|
|
#18+
BleachWhite Owlпропущено... Ты не видишь разницы между конструктором и инициализатором. Отсюда и все твои проблемы. А можна немного поподробнее? ну или ссыль где курить Конструктор это процедура которая создает объект. Выделяет память, создает вложенные объекты и тп. Инициализатор это процедура которая наполняет существующий объект начальными значениями. Чаще всего обе эти операции соединены в одну и располагаются внутри конструктора синтаксически. Но могут быть и разнесены. Тогда конструктор занимается только выделением ресурсов. А инициализатор вызывается либо из самого конструктора, либо отдельно. Это дает дополнительную возможность вызвать "обнуление" объекта в любое время. Как пример: Нам нужен диалог на экране. В диалоге всегда есть какие-то стартовые тексты в полях ввода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Теперь ты не сможешь создать этот диалог не указав начальные значения name и address. Но при этом сможешь и задать эти поля отдельно, уже после того как конструктор давным-давно отработал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2015, 18:41 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2019068]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 9ms |
| total: | 167ms |

| 0 / 0 |
