Зачем нужен пустой конструктор по-умолчанию C++? #592385


#0 by Mits
Если он ничего не делает, а компилятор его добавляет.
#1 by Mits
думаю тут могут быть знатоки C++
#2 by ДенисЧ
чтобы можно было создать объект...
#3 by Mits
то есть компилятор не сможет создать объект без конструктора, это как-бы необходимый шаг, даже если конструктор пустой
#4 by Rie
Если программист не определил конструктор в классе - то компилятор создаст конструктор (без параметров) для создания объектов этого класса. Но мне кажется, вопрос в чём-то другом?
#5 by Mits
вопрос зачем он это сделает
#6 by Rie
А иначе возникнут проблемы с созданием class B { int i; } class D: B { int j; D { j=0; } } /* при создании D надо вызвать конструктор для B - а его нет */ class C { B x; C {} } /* x надо ведь как-то создать */ Но если программист определил свой конструктор - то будет использоваться тот, что определил программист.
#7 by Mits
вообщем это нужно компилятору, иначе бы он мог обходить такие ситуации
#8 by Mits
И еще один вопрос: у этого конструктора есть какое-то побочное действие?
#9 by Mikeware
Да, собственно, и программа на С++ нужна тоже компилятору. Если нет программы на С++ - нахрена тогда нужен компилятор? :-)
#10 by Rie
??? Вообще-то всё это нужно программисту. В том числе и конструктор по умолчанию. struct B { B { cout<<"Wow!"; } }; struct D: B { int i; }; int main { D x; }
#11 by Rie
+ Ну или class B { private: B {} }: class D: public B { int i; }: int main { D x; }
#12 by Mits
Просто механизм конструктора по-умолчанию прозрачен для программиста, также как и кэш-память процессора.
#13 by Rie
У _какого_? См. - как работает конструктор по умолчанию для D.
#14 by Rie
Да нет. Надо знать этот механизм (а в C++ он не так уж и прост; впрочем, а что в C++ сделано просто?)
#15 by Mits
Сложность c++ в том, что этот язык дает полную свободу программисту и в тоже время это заставлет его делать все вручную. Хотя есть библиотеки STL и другие библиотеки.
#16 by Rie
Используй другой язык :-)
#17 by Xapac
разрыв мозга просто. "я теперь понял, что они не пересекаются, но я не могу понять почему они не пересекаются"
#18 by Steel_Wheel
Чтобы можно было создать экземпляр класса.... хоть бы и пустой
#19 by Steel_Wheel
Самый логичный язык, кмк... Ну, Ява еще. В ней код особенно элегантно выглядит
#20 by Rie
Логичный. Один из наиболее точно и строго определённых языков (а среди промышленных языков - как бы не самый). Но проблема в том, что эту логику надо знать. Ну и эта логика (впрочем, как и любая другая) - не слишком наглядна (на любом форуме по C++ полно вопросов "а как эта хрень должна работать?", ответ на которые всегда находится и обосновывается - но не всегда очевиден).
#21 by Ненавижу 1С
фигня, Си уже страдал фигней, а в плюсах вместо полировки качества языка - фигни только добавили и стало просто жёпа вот такой он Си++ неудобный, но в свое время был наилучшим, всему свое время есть, приходит и уходит
#22 by zak555
что неудобного ?
#23 by Рэйв
тебе объяснить слово "по умолчанию"? или объяснить почему совсем без конструктора нельзя?
#24 by Xapac
??
#25 by Rie
"Верблюда спросили: - Почему у тебя спина кривая? - А что у меня прямое? - ответил верблюд"
#26 by Mikeware
"смотри, как они лошадку изуродовали!!!"©
#27 by Рэйв
Вот именно. Положено так по сценарию. :-)
#28 by Rie
Если не утрировать - то действительно имеет место быть набор неудобств. Как следствие сложности самих языковых механизмов. Столь гибкое множественное наследие вкупе с управлением областями видимости нечасто встретишь, а если на это накладывается мощь C++ных шаблонов (которые, вообще говоря, как бы не Тьюринг-полные) - то начинается сплошное веселье.
#29 by Рэйв
Всегда ненавидел разбирать эти библиотеки..Там как в вики - начнешь искать отчество Ленина, очнешься  что читаешь про овечку Долли....
#30 by Rie
+ Да и хотя бы те же конструкторы - они ведь в C++ отличаются от всех прочих (Java, Delphi, C# и т.д.).
#31 by Рэйв
В шарпе вроде также все.
#32 by Rie
"Кормил ребёнка. Положил соску на горячую плиту. Она прилипла. Набрал в поисковике "Как отодрать соску"..." (c) молодой, но уже бородатый анекдот
#33 by Рэйв
синтаксис может чуть другой
#34 by PushoN
ты когда родился у родителей не спросил почему у тебя 5 пальце на одной руке а не 4 ?
#35 by PushoN
чушь несешь!
#36 by Rie
Не совсем. Конструктор в C++ работает с ещё не до конца созданным объектом - отсюда и некоторые ограничения. В новом стандарте это вроде бы подправили. Но (как обычно:-) сохранив "тонкую логику".
#37 by PushoN
вообще иди читай что такое есть конструктор в ООП.
#38 by Rie
А чем ему это поможет? (Честно говоря, я так и не понял, что именно хотел узнать ТС).
#39 by Рэйв
Да  его жаба давит от пустой процедуры которая ничего не делает, но без которой ниче не работает:-)
#40 by Rie
Он не понимает, что она - НЕ пустая (в общем случае). И НЕ функция :-) (Насчёт последнего - поэтому ему и мало поможет общее понятие конструктора, поскольку в разных языках конструктор трактуется по разному).
#41 by Рэйв
В плюсах еси што вообще нет функций:-)..Есть void, есть не void
#42 by Рэйв
+Вернее нет процедур, да:-)..
#43 by ДенисЧ
Вброс: с++ не нужен, если есть хаскель и немерле...
#44 by Steel_Wheel
Я что-то пропустил... А когда С++ успел так сильно поменяться?
#45 by Steel_Wheel
В смысле "не до конца"? Кажется, память уже выделена под типы, которые ты заявил в качестве переменных-членов класса. Т.е. с ними уже можно работать
#46 by Rie
Есть конструкторы :-) Они в C++ - не функции (ну или не совсем функции) :-)
#47 by Torquader
Не забывайте, что обязательно должен быть конструктор копирования (то есть функция, создающая один объект на основе другого такого же) - его компилятор создаёт автоматически, также как создаётся функция копирования для любых структур. Только это всё делается на этапах компиляции - в итоговом коде, если конструктор пустой, ничего вообще не появится.
#48 by Rie
Тут главная фишка не в том, что конструкторы создаются автоматически, а в том, что их можно переопределить - и получить от этого бонус (или по лбу - если глупо переопределить).
#49 by Ненавижу 1С
си++ очень мощен, спору нет, но... никто не отменял!
#50 by DGorgoN
Конструктор нужен всяко по стандартам языка для создания обьекта. Если конструктора нет - то и нет объекта.
#51 by SUA
известная "точность" - что будет в переменной после вычисления int i=5;i=++i + ++i;
#52 by toypaul
делает он это, чтобы инициализировать переменные объекта. например, переменные объекты.
#53 by Sk0rp
Объективных причин нет и это скорее всего компиляторозависимая фича. Такое на этапе компиляции прекрасно разруливается, можно сделать конструктор private и компилятор сам расскажет про все неявные места его вызова или попытки взять адрес.
#54 by Sk0rp
+ Конечно, если в теле есть объекты у которых есть свои конструкторы, то тогда надо сформировать код, который их в правильном порядке вызовет. Тогда генерация конструктора необходима и неизбежна. Более того компилятор вставит этот код даже в созданный явно конструктор. Переопределить это поведение можно записав вызов конструкторов через двоеточие после декларации конструктора,но до его тела (до открывающей фигурной скобки)
#55 by Sk0rp
C++0x посмотри, там кусок boost'а внесен в стандарт, введены автоматические типы переменных и еще куча всего.
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С