Автоматические конструкторы С++
От: Sergey J. A. Беларусь  
Дата: 29.06.04 13:24
Оценка:
В своё время спорили с преподом что лучше C++ или Delphi.
Как довод недостатка С++ препода указал автоматические конструкторы, но не уточнил почему это плохо.
Хотелось бы узнать, так ли это и почему ?
Re: Автоматические конструкторы С++
От: PM  
Дата: 29.06.04 13:26
Оценка:
Здраствуйте, Sergey, Вы писали:

SJA> В своё время спорили с преподом что лучше C++ или Delphi.

SJA> Как довод недостатка С++ препода указал автоматические конструкторы,
SJA> но не уточнил почему это плохо. Хотелось бы узнать, так ли это и
SJA> почему ?
А что такое "автоматические конструкторы"? Первый раз такой термин вижу
foobar2000 v0.8.2: The Moebus — Plasm 604 [SUB-MISSION — THE VERY BEST OF] (пауза)
Posted via RSDN NNTP Server 1.9 alpha
Re[2]: Автоматические конструкторы С++
От: Sergey J. A. Беларусь  
Дата: 29.06.04 13:30
Оценка: +1
Здравствуйте, 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;
Re[3]: Автоматические конструкторы С++
От: LaptevVV Россия  
Дата: 29.06.04 13:35
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

PM>>А что такое "автоматические конструкторы"? Первый раз такой термин вижу


SJA>Термин препода. Я так понял, имеется в виду что в С++ конструктор объекта вызывается сам. А в паскале, наверное его надо вызвать отдельно. Что-то вроде:

SJA>form:TForm;
SJA>form.Create();

SJA>Ну или что-то вроде того.

Не, нету никаких автоматических конструкторов.
Это испорченный телефон.
Скорее всего имеется ввиду. что в С++ при некоторых обстоятельствах два конструктора создаются автоматически: без параметров и копирования. Автоматически создается также деструктор. Вот он-то как раз автоматически вызывается.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Автоматические конструкторы С++
От: PM  
Дата: 29.06.04 13:35
Оценка:
Здраствуйте, 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]
Posted via RSDN NNTP Server 1.9 alpha
Re: Автоматические конструкторы С++
От: Bell Россия  
Дата: 29.06.04 13:40
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

SJA>В своё время спорили с преподом что лучше C++ или Delphi.


Это спор из разряда "религиозных"

SJA>Как довод недостатка С++ препода указал автоматические конструкторы, но не уточнил почему это плохо.

"Это плохо, потому что это плохо". ИМХО, такие утверждения просто не заслуживают внимания. Где аргументация?

SJA>Хотелось бы узнать, так ли это и почему?

Это одно из фундаментальных свойсти С++. На этом свойстве основано огромное множество решений, применяемых при разработке на С++. Если подобное свойство языка тебя не устраивает — используй другой.

ЗЫ
может имеет смысл пойти в форум "религиозные войны", и спросить че-нить типа "автоматические конструкторы — плохо это, или хорошо".
Любите книгу — источник знаний (с) М.Горький
Re[4]: Автоматические конструкторы С++
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 29.06.04 13:40
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Не, нету никаких автоматических конструкторов.

LVV>Это испорченный телефон.
LVV>Скорее всего имеется ввиду. что в С++ при некоторых обстоятельствах два конструктора создаются автоматически: без параметров и копирования. Автоматически создается также деструктор. Вот он-то как раз автоматически вызывается.

ИМХО речь о том, что в C++ конструктор предка необходимо явным образом вызывать в конструкторе потомка, причем не где попало, как в OP, а в строго отведенном для этого месте (если, конечно, у предка нет конструктора по умолчанию). Помню, меня в свое время при переходе с Pascal на C++ это тоже несколько... э-э-э... напрягало... но потом проникся.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[4]: Автоматические конструкторы С++
От: Sergey J. A. Беларусь  
Дата: 29.06.04 13:43
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Sergey J. A., Вы писали:


PM>>>А что такое "автоматические конструкторы"? Первый раз такой термин вижу


SJA>>Термин препода. Я так понял, имеется в виду что в С++ конструктор объекта вызывается сам. А в паскале, наверное его надо вызвать отдельно. Что-то вроде:

SJA>>form:TForm;
SJA>>form.Create();

SJA>>Ну или что-то вроде того.

LVV>Не, нету никаких автоматических конструкторов.
LVV>Это испорченный телефон.
LVV>Скорее всего имеется ввиду. что в С++ при некоторых обстоятельствах два конструктора создаются автоматически: без параметров и копирования. Автоматически создается также деструктор. Вот он-то как раз автоматически вызывается.

Ну допустим преп имел в виду, что конструктор автоматически генерируется, если он отсутствует. В таком случае что мог иметь в виду преп. под недостатком ? Может то, что в паскале без конструктора класс не напишеш, а в С++ можно забыть это сделать ? Или что ?
Вообще судя по разговорам преп. считал это самым большим недостатком С++
Я — свихнувшееся сознание Джо
Re[2]: Автоматические конструкторы С++
От: Lorenzo_LAMAS  
Дата: 29.06.04 13:44
Оценка: :))) :))) :))
Мой препод, помнится, в качестве "недостатка С++" приводил то, что он не может конструкторы разными именами называть.
Of course, the code must be complete enough to compile and link.
Re[2]: Автоматические конструкторы С++
От: Sergey J. A. Беларусь  
Дата: 29.06.04 13:49
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Sergey J. A., Вы писали:


SJA>>В своё время спорили с преподом что лучше C++ или Delphi.


B>Это спор из разряда "религиозных"


Естественно. Мы долго флудили, но в реале.

SJA>>Как довод недостатка С++ препода указал автоматические конструкторы, но не уточнил почему это плохо.

B>"Это плохо, потому что это плохо". ИМХО, такие утверждения просто не заслуживают внимания. Где аргументация?
Я вот и спрашиваю про аргументацию, ибо в своё время не удосужился спросить.

B>ЗЫ

B>может имеет смысл пойти в форум "религиозные войны", и спросить че-нить типа "автоматические конструкторы — плохо это, или хорошо".
Не Я просто хочу узнать что преп имел в виду. Какой именно недостаток (или мнимый недостаток) С++.
Я — свихнувшееся сознание Джо
Re[5]: Автоматические конструкторы С++
От: rus blood Россия  
Дата: 29.06.04 13:58
Оценка:
SJA>Ну допустим преп имел в виду, что конструктор автоматически генерируется, если он отсутствует. В таком случае что мог иметь в виду преп. под недостатком ? Может то, что в паскале без конструктора класс не напишеш, а в С++ можно забыть это сделать ? Или что ?
SJA>Вообще судя по разговорам преп. считал это самым большим недостатком С++

Наверно твой препод напоролся на какую-нить проблему с неявным добавлением/определением чего-то компилятором/транслятором (типа "IJKLMN" в Фортране), и теперь проповедует на основе своего опыта.

"Все, что делает компилятор неявно и по умолчанию — плохо."
Имею скафандр — готов путешествовать!
Re: Автоматические конструкторы С++
От: martin Беларусь  
Дата: 29.06.04 14:01
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

SJA>В своё время спорили с преподом что лучше C++ или Delphi.

SJA>Как довод недостатка С++ препода указал автоматические конструкторы, но не уточнил почему это плохо.
SJA>Хотелось бы узнать, так ли это и почему ?

Хочу немного добавить. Просто наш товаришь преподаватель был рьяным поклонником Delphi. И он считал, что возможность иметь конструкторы с разными именами большым преимуществом. А то что в С++ конструкторы вызываются автоматически при создинии объекта считал полным идиотизмом и не мог понять как в С++ до этого дошли.
Re[2]: Автоматические конструкторы С++
От: Кодт Россия  
Дата: 29.06.04 14:49
Оценка:
Здравствуйте, 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);
}
Перекуём баги на фичи!
Re[3]: Автоматические конструкторы С++
От: Sergey J. A. Беларусь  
Дата: 29.06.04 15:04
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Потому что конструкторы в C++ и ObjectPascal — это разные вещи.

Вот кстати, интересно было бы узнать в чём их ключевое отличие ?
Я — свихнувшееся сознание Джо.
Re[3]: Автоматические конструкторы С++
От: ssm Россия  
Дата: 29.06.04 15:20
Оценка:
Здравствуйте, Кодт, Вы писали:


К>На С++ делаем


или просто:

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);
}
Re[4]: Автоматические конструкторы С++
От: maq Россия http://www.maqdev.com
Дата: 29.06.04 15:36
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

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


К>>Потому что конструкторы в C++ и ObjectPascal — это разные вещи.

SJA>Вот кстати, интересно было бы узнать в чём их ключевое отличие ?

Я думаю в том что конструкторы в C++ занимаются инициализацией например VMT,
а в Дельфи конструктор вызывается после его инициализации и может быть виртуальным
... << Rsdn@Home 1.1.4 beta 1 >>
Re[5]: Автоматические конструкторы С++
От: Sergey J. A. Беларусь  
Дата: 29.06.04 15:41
Оценка:
Здравствуйте, maq, Вы писали:

К>>>Потому что конструкторы в C++ и ObjectPascal — это разные вещи.

SJA>>Вот кстати, интересно было бы узнать в чём их ключевое отличие ?

maq>Я думаю в том что конструкторы в C++ занимаются инициализацией например VMT,

maq>а в Дельфи конструктор вызывается после его инициализации и может быть виртуальным

Если так, то в чём его отличие от обычной процедуры ?
Зачем эта дополнительная сущность, спросил бы старина Оккам ?
Я — свихнувшееся сознание Джо.
Re[6]: Автоматические конструкторы С++
От: maq Россия http://www.maqdev.com
Дата: 29.06.04 15:49
Оценка:
maq>>Я думаю в том что конструкторы в C++ занимаются инициализацией например VMT,
maq>>а в Дельфи конструктор вызывается после его инициализации и может быть виртуальным

SJA>Если так, то в чём его отличие от обычной процедуры ?

SJA>Зачем эта дополнительная сущность, спросил бы старина Оккам ?

Вроде особенно и не отличается.
Но компилятор проверяет синтаксис при вызове,
выделяет память и инициализирует VMT.
... << Rsdn@Home 1.1.4 beta 1 >>
Re[3]: Автоматические конструкторы С++
От: Xentrax Россия http://www.lanovets.ru
Дата: 29.06.04 16:30
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

SJA>>>Как довод недостатка С++ препода указал автоматические конструкторы, но не уточнил почему это плохо.

B>>"Это плохо, потому что это плохо". ИМХО, такие утверждения просто не заслуживают внимания. Где аргументация?
SJA>Я вот и спрашиваю про аргументацию, ибо в своё время не удосужился спросить.

В дельфи при создании объекта класса тоже много чего вызывается

Что касается именованных конструкторов, то в принципе логично, что именованные конструкторы удобнее неименованных (навскидку — снижается вероятность ошибок, увеличивается скорость компиляции, улучшается самодокументируемость кода...)
С другой стороны, для профессионального программиста в данном случае все определяется привычкой, и большой разницы нет, как получен результат — по объему кода получается одинаково. Для объектов в куче можно вообще написать статические функции, возвращающие уже готовый инициализированный указатель. Можно придумать какую-нибудь функцию типа ConstructL, которую вызывать для инициализации, а проще не заморачиваться — и перегрузить конструктор.


Что касается философии, то за годы программирования на самых разных языках я пришел к выводу, что зачастую простота компиляции сильно коррелирует с простотой кодирования. Конечно можно сказать, что асм тоже быстро компилируется, но если сравнить скорость комплиляции кода OP и С++...
OP+VCL значительно лучше способствуют решению реальной задачи рядовым программистом. А например C++ и MFC ставят перед программистом больше технических задач, отодвингая реальную проблем на второй план. Т.е. MFC как плохая обертка заставляет много думать о WINAPI, а C++ как плохой язык — много о всяких конструкторах/деструкторах/VMT/срезке объектов итп. Т.е. при переходе с Delphi на VC программист начинает тратить основную часть времени на UI, и на поиск багов в UI.
Понятно, что в современных условиях, когда программистов нужно много, а задач перед ними стоит еще больше, высокопроизводительный и многопрощающий язык с хорошим farmework категорически важен. Так и появился .Net.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.