В своё время спорили с преподом что лучше C++ или Delphi.
Как довод недостатка С++ препода указал автоматические конструкторы, но не уточнил почему это плохо.
Хотелось бы узнать, так ли это и почему ?
Здраствуйте, Sergey, Вы писали:
SJA> В своё время спорили с преподом что лучше C++ или Delphi. SJA> Как довод недостатка С++ препода указал автоматические конструкторы, SJA> но не уточнил почему это плохо. Хотелось бы узнать, так ли это и SJA> почему ?
А что такое "автоматические конструкторы"? Первый раз такой термин вижу
foobar2000 v0.8.2: The Moebus — Plasm 604 [SUB-MISSION — THE VERY BEST OF] (пауза)
Здравствуйте, PM, Вы писали:
PM>Здраствуйте, Sergey, Вы писали:
SJA>> В своё время спорили с преподом что лучше C++ или Delphi. SJA>> Как довод недостатка С++ препода указал автоматические конструкторы, SJA>> но не уточнил почему это плохо. Хотелось бы узнать, так ли это и SJA>> почему ? PM>А что такое "автоматические конструкторы"? Первый раз такой термин вижу
Термин препода. Я так понял, имеется в виду что в С++ конструктор объекта вызывается сам. А в паскале, наверное его надо вызвать отдельно. Что-то вроде:
form:TForm;
form.Create();
Ну или что-то вроде того.
Re[3]: Автоматические конструкторы С++
От:
Аноним
Дата:
29.06.04 13:34
Оценка:
Ну так препод ерунду говорил .Если ему так нужна подобная вещь, пусть пишет SomeClass * p = 0; p = new SomeClass;
Здравствуйте, Sergey J. A., Вы писали:
PM>>А что такое "автоматические конструкторы"? Первый раз такой термин вижу
SJA>Термин препода. Я так понял, имеется в виду что в С++ конструктор объекта вызывается сам. А в паскале, наверное его надо вызвать отдельно. Что-то вроде: SJA>form:TForm; SJA>form.Create();
SJA>Ну или что-то вроде того.
Не, нету никаких автоматических конструкторов.
Это испорченный телефон.
Скорее всего имеется ввиду. что в С++ при некоторых обстоятельствах два конструктора создаются автоматически: без параметров и копирования. Автоматически создается также деструктор. Вот он-то как раз автоматически вызывается.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здраствуйте, Sergey, Вы писали:
PM>> А что такое "автоматические конструкторы"? Первый раз такой термин PM>> вижу
SJA> Термин препода. Я так понял, имеется в виду что в С++ конструктор SJA> объекта вызывается сам. А в паскале, наверное его надо вызвать SJA> отдельно. Что-то вроде: form:TForm; SJA> form.Create();
SJA> Ну или что-то вроде того.
Тогда уж надо говорить о недостатке Object Pascal, в котором не возможно создавать объекты классов на стеке, и как следствие — невозможноть использования идиомы RAII. Приходится втыкать везде try-finally
А вообще, тема для форума "Священные войны".
foobar2000 v0.8.2: The Moebus — Plasm 604 [SUB-MISSION — THE VERY BEST OF]
Здравствуйте, Sergey J. A., Вы писали:
SJA>В своё время спорили с преподом что лучше C++ или Delphi.
Это спор из разряда "религиозных"
SJA>Как довод недостатка С++ препода указал автоматические конструкторы, но не уточнил почему это плохо.
"Это плохо, потому что это плохо". ИМХО, такие утверждения просто не заслуживают внимания. Где аргументация?
SJA>Хотелось бы узнать, так ли это и почему?
Это одно из фундаментальных свойсти С++. На этом свойстве основано огромное множество решений, применяемых при разработке на С++. Если подобное свойство языка тебя не устраивает — используй другой.
ЗЫ
может имеет смысл пойти в форум "религиозные войны", и спросить че-нить типа "автоматические конструкторы — плохо это, или хорошо".
Здравствуйте, LaptevVV, Вы писали:
LVV>Не, нету никаких автоматических конструкторов. LVV>Это испорченный телефон. LVV>Скорее всего имеется ввиду. что в С++ при некоторых обстоятельствах два конструктора создаются автоматически: без параметров и копирования. Автоматически создается также деструктор. Вот он-то как раз автоматически вызывается.
ИМХО речь о том, что в C++ конструктор предка необходимо явным образом вызывать в конструкторе потомка, причем не где попало, как в OP, а в строго отведенном для этого месте (если, конечно, у предка нет конструктора по умолчанию). Помню, меня в свое время при переходе с Pascal на C++ это тоже несколько... э-э-э... напрягало... но потом проникся.
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Sergey J. A., Вы писали:
PM>>>А что такое "автоматические конструкторы"? Первый раз такой термин вижу
SJA>>Термин препода. Я так понял, имеется в виду что в С++ конструктор объекта вызывается сам. А в паскале, наверное его надо вызвать отдельно. Что-то вроде: SJA>>form:TForm; SJA>>form.Create();
SJA>>Ну или что-то вроде того. LVV>Не, нету никаких автоматических конструкторов. LVV>Это испорченный телефон. LVV>Скорее всего имеется ввиду. что в С++ при некоторых обстоятельствах два конструктора создаются автоматически: без параметров и копирования. Автоматически создается также деструктор. Вот он-то как раз автоматически вызывается.
Ну допустим преп имел в виду, что конструктор автоматически генерируется, если он отсутствует. В таком случае что мог иметь в виду преп. под недостатком ? Может то, что в паскале без конструктора класс не напишеш, а в С++ можно забыть это сделать ? Или что ?
Вообще судя по разговорам преп. считал это самым большим недостатком С++
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Sergey J. A., Вы писали:
SJA>>В своё время спорили с преподом что лучше C++ или Delphi.
B>Это спор из разряда "религиозных"
Естественно. Мы долго флудили, но в реале.
SJA>>Как довод недостатка С++ препода указал автоматические конструкторы, но не уточнил почему это плохо. B>"Это плохо, потому что это плохо". ИМХО, такие утверждения просто не заслуживают внимания. Где аргументация?
Я вот и спрашиваю про аргументацию, ибо в своё время не удосужился спросить.
B>ЗЫ B>может имеет смысл пойти в форум "религиозные войны", и спросить че-нить типа "автоматические конструкторы — плохо это, или хорошо".
Не Я просто хочу узнать что преп имел в виду. Какой именно недостаток (или мнимый недостаток) С++.
SJA>Ну допустим преп имел в виду, что конструктор автоматически генерируется, если он отсутствует. В таком случае что мог иметь в виду преп. под недостатком ? Может то, что в паскале без конструктора класс не напишеш, а в С++ можно забыть это сделать ? Или что ? SJA>Вообще судя по разговорам преп. считал это самым большим недостатком С++
Наверно твой препод напоролся на какую-нить проблему с неявным добавлением/определением чего-то компилятором/транслятором (типа "IJKLMN" в Фортране), и теперь проповедует на основе своего опыта.
"Все, что делает компилятор неявно и по умолчанию — плохо."
Здравствуйте, Sergey J. A., Вы писали:
SJA>В своё время спорили с преподом что лучше C++ или Delphi. SJA>Как довод недостатка С++ препода указал автоматические конструкторы, но не уточнил почему это плохо. SJA>Хотелось бы узнать, так ли это и почему ?
Хочу немного добавить. Просто наш товаришь преподаватель был рьяным поклонником Delphi. И он считал, что возможность иметь конструкторы с разными именами большым преимуществом. А то что в С++ конструкторы вызываются автоматически при создинии объекта считал полным идиотизмом и не мог понять как в С++ до этого дошли.
Здравствуйте, martin, Вы писали:
SJA>>В своё время спорили с преподом что лучше C++ или Delphi. SJA>>Как довод недостатка С++ препода указал автоматические конструкторы, но не уточнил почему это плохо. SJA>>Хотелось бы узнать, так ли это и почему ?
M>Хочу немного добавить. Просто наш товаришь преподаватель был рьяным поклонником Delphi. И он считал, что возможность иметь конструкторы с разными именами большым преимуществом. А то что в С++ конструкторы вызываются автоматически при создинии объекта считал полным идиотизмом и не мог понять как в С++ до этого дошли.
Потому что конструкторы в C++ и ObjectPascal — это разные вещи.
Кроме того, в С++ несложно сделать то, ради чего затеяны разноимённые конструкторы. Это разные сигнатуры.
Пусть у класса TRectangle есть конструкторы Create(), CreateXYWH(x:integer,y:integer,w:integer,h:integer) и CreateLTRB(l:integer,t:integer,r:integer,b:integer). Последние два — невозможно различить по типам и количеству аргументов, только по имени.
На С++ делаем
enum tag_xywh { XYWH }; // для различения типовenum tag_xtrb { LTRB };
class TRectangle
{
public:
TRectangle();
TRectangle(tag_xywh, int x, int y, int w, int h);
TRectangle(tag_ltrb, int x, int y, int w, int h);
};
main()
{
TRectangle a (XYWH,1,2,3,4);
TRectangle b (LTRB,1,2,4,6);
}
Здравствуйте, Кодт, Вы писали:
К>Потому что конструкторы в C++ и ObjectPascal — это разные вещи.
Вот кстати, интересно было бы узнать в чём их ключевое отличие ?
class TRectangle
{
public:
static TRectangle * CreateXYWH(int x, int y, int w, int h);
static TRectangle * CreateLRTB(int x, int y, int w, int h);
};
int main()
{
TRectangle *pr1 = TRectangle::CreateXYWH(1, 2, 3, 4);
TRectangle *pr2 = TRectangle::CreateLRTB(1, 2, 3, 4);
}
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, Кодт, Вы писали:
К>>Потому что конструкторы в C++ и ObjectPascal — это разные вещи. SJA>Вот кстати, интересно было бы узнать в чём их ключевое отличие ?
Я думаю в том что конструкторы в C++ занимаются инициализацией например VMT,
а в Дельфи конструктор вызывается после его инициализации и может быть виртуальным
Здравствуйте, maq, Вы писали:
К>>>Потому что конструкторы в C++ и ObjectPascal — это разные вещи. SJA>>Вот кстати, интересно было бы узнать в чём их ключевое отличие ?
maq>Я думаю в том что конструкторы в C++ занимаются инициализацией например VMT, maq>а в Дельфи конструктор вызывается после его инициализации и может быть виртуальным
Если так, то в чём его отличие от обычной процедуры ?
Зачем эта дополнительная сущность, спросил бы старина Оккам ?
maq>>Я думаю в том что конструкторы в C++ занимаются инициализацией например VMT, maq>>а в Дельфи конструктор вызывается после его инициализации и может быть виртуальным
SJA>Если так, то в чём его отличие от обычной процедуры ? SJA>Зачем эта дополнительная сущность, спросил бы старина Оккам ?
Вроде особенно и не отличается.
Но компилятор проверяет синтаксис при вызове,
выделяет память и инициализирует VMT.
Здравствуйте, Sergey J. A., Вы писали:
SJA>>>Как довод недостатка С++ препода указал автоматические конструкторы, но не уточнил почему это плохо. B>>"Это плохо, потому что это плохо". ИМХО, такие утверждения просто не заслуживают внимания. Где аргументация? SJA>Я вот и спрашиваю про аргументацию, ибо в своё время не удосужился спросить.
В дельфи при создании объекта класса тоже много чего вызывается
Что касается именованных конструкторов, то в принципе логично, что именованные конструкторы удобнее неименованных (навскидку — снижается вероятность ошибок, увеличивается скорость компиляции, улучшается самодокументируемость кода...)
С другой стороны, для профессионального программиста в данном случае все определяется привычкой, и большой разницы нет, как получен результат — по объему кода получается одинаково. Для объектов в куче можно вообще написать статические функции, возвращающие уже готовый инициализированный указатель. Можно придумать какую-нибудь функцию типа ConstructL, которую вызывать для инициализации, а проще не заморачиваться — и перегрузить конструктор.
Что касается философии, то за годы программирования на самых разных языках я пришел к выводу, что зачастую простота компиляции сильно коррелирует с простотой кодирования. Конечно можно сказать, что асм тоже быстро компилируется, но если сравнить скорость комплиляции кода OP и С++...
OP+VCL значительно лучше способствуют решению реальной задачи рядовым программистом. А например C++ и MFC ставят перед программистом больше технических задач, отодвингая реальную проблем на второй план. Т.е. MFC как плохая обертка заставляет много думать о WINAPI, а C++ как плохой язык — много о всяких конструкторах/деструкторах/VMT/срезке объектов итп. Т.е. при переходе с Delphi на VC программист начинает тратить основную часть времени на UI, и на поиск багов в UI.
Понятно, что в современных условиях, когда программистов нужно много, а задач перед ними стоит еще больше, высокопроизводительный и многопрощающий язык с хорошим farmework категорически важен. Так и появился .Net.