Вот еще избыточность. Почему при динамическом создании объектов надо указывать имя класса два раза? Вот смотрите:
LongAndMeaningfulClassName *obj = new LongAndMeaningfulClassName(...)
Да-да-да, я знаю, что obj можно объявить переменной базового класса. А все-таки в большинстве случаев классы совпадают и получается избыточность.
А теперь насчет неестественностей.
1. Почему операция, обратная к new, называется delete? Во-первых, эти слова не антонимы, как, скажем, create/destroy, open/close и т.п. Никто, кроме программиста на C++, не догадается, что антонимом к new может служить delete. Во-вторых, почему вообще new — операция? new — это прилагательное, а delete — глагол. Как глагол и прилагательное могут означать противоположные понятия? И как _дейстие_ (создание объекта) можно обозначать прилагательным?
2. Эта претензия уже не столько к самому языку, сколько к разработчикам библиотек. Почему операцию конкатенации строк обозначают символом `+'? Что у нее общего с операцией сложения? Гораздо меньше, чем, скажем, с умножением. Конкатенация некоммутативна. А в математике принято символом плюса обозначать коммутативные операции. Поэтому даже использование символа `*' для конкатенации было бы естественнее, потому что умножение имеет право быть некоммутативным. А еще лучше было бы сделать отдельный оператор для конкатенации, чтобы, глядя на код
x = y + z
не приходилось гадать, складываются ли здесь числа или склеиваются строки.
Re[10]: Синтаксический оверхед
От:
Аноним
Дата:
27.06.05 04:38
Оценка:
M>AT&T (где начинал разрабатываться C++), да будет Вам известно — исследовательская лаборатория,
Разве? Я всегда считал, что American Telephone & Telegraph — сугубо коммерческая организация...
Re[3]: Синтаксический оверхед - Новая порция
От:
Аноним
Дата:
27.06.05 04:44
Оценка:
F>
F>LongAndMeaningfulClassName *obj = new LongAndMeaningfulClassName(...)
F>
F>А теперь насчет неестественностей. F>1. Почему операция, обратная к new, называется delete?
Черт, а ведь и правда! Действительно, куда естественней было бы писать:
Здравствуйте, faulx, Вы писали:
F>А теперь насчет неестественностей.
F>1. Почему операция, обратная к new, называется delete? Во-первых, эти слова не антонимы, как, скажем, create/destroy, open/close и т.п. Никто, кроме программиста на C++, не догадается, что антонимом к new может служить delete. Во-вторых, почему вообще new — операция? new — это прилагательное, а delete — глагол. Как глагол и прилагательное могут означать противоположные понятия? И как _дейстие_ (создание объекта) можно обозначать прилагательным?
Все очень просто. Дело в том, что new type() — это выражение. Оно возвращает новый объект указанного типа. А delete — это оператор, который ничего не возвращает, т.е. просто инициирует действие. Вот и глагол. По этой логике, воображаемый оператор create type() должен был бы создавать новый объект, но не возвращать ничего F>2. Эта претензия уже не столько к самому языку, сколько к разработчикам библиотек. Почему операцию конкатенации строк обозначают символом `+'? Что у нее общего с операцией сложения? Гораздо меньше, чем, скажем, с умножением. Конкатенация некоммутативна. А в математике принято символом плюса обозначать коммутативные операции. F>Поэтому даже использование символа `*' для конкатенации было бы естественнее, потому что умножение имеет право быть некоммутативным. А еще лучше было бы сделать отдельный оператор для конкатенации, чтобы, глядя на код F>
F>x = y + z
F>
F>не приходилось гадать, складываются ли здесь числа или склеиваются строки.
В принципе верно. Кстати, в VB конкатенация — это &. Что можно было бы перегрузить для строк. Тем не менее, в программировании традиция использования + для конкатенации имеет достаточно большую историю применения, и особых проблем не вызывает.
Вообще, перегрузка операторов в плюсах — довольно-таки специфическая штука. Ну вот к примеру — для ввода-вывода используются операторы сдвига. Неожиданно, правда? Однако никто не мучается тем, что операция "сдвинуть поток на 4" не эквивалентна "умножить поток на 16". Поэтому выбор операторов для нематематических классов — дело вкусв.
Для математики — да, все верно. Стоит сохранять известные тождества:
Здравствуйте, Аноним, Вы писали:
А>Черт, а ведь и правда! Действительно, куда естественней было бы писать: А>
А>old obj;
А>
Кстати, в языке Eiffel конструкция old var есть и обозначает старое значение переменной var, т.е. то, чему она была равна на момент входа в метод. Используется в постусловиях, которые там встроены в язык.
Здравствуйте, Sinclair, Вы писали:
F>>1. Почему операция, обратная к new, называется delete? Во-первых, эти слова не антонимы, как, скажем, create/destroy, open/close и т.п. Никто, кроме программиста на C++, не догадается, что антонимом к new может служить delete. Во-вторых, почему вообще new — операция? new — это прилагательное, а delete — глагол. Как глагол и прилагательное могут означать противоположные понятия? И как _дейстие_ (создание объекта) можно обозначать прилагательным? S>Все очень просто. Дело в том, что new type() — это выражение. Оно возвращает новый объект указанного типа. А delete — это оператор, который ничего не возвращает, т.е. просто инициирует действие. Вот и глагол. По этой логике, воображаемый оператор create type() должен был бы создавать новый объект, но не возвращать ничего
К сожалению, не могу согласиться. Вызов, например, функции open — это тоже выражение, которое возвращает дескриптор файла. Ничто не мешает "воображаемому оператору create" возвращать новый объект.
Кстати, теоретически, delete может возвращать значение. Если написать свой распределитель памяти, то при неудачном освобождении (передали не тот указатель) можно сообщить об ошибке, бросив исключение. Исключение — это, в каком-то смысле, тоже возвращаемое значение.
S>В принципе верно. Кстати, в VB конкатенация — это &. Что можно было бы перегрузить для строк. Тем не менее, в программировании традиция использования + для конкатенации имеет достаточно большую историю применения, и особых проблем не вызывает.
Привыкнуть можно к очень многому. Однако есть большое число языков, где конкатенация и сложение разделены. И VB не стоит отметать — все-таки язык рассчитан на "нормальных" людей, не "программистов".
S>Вообще, перегрузка операторов в плюсах — довольно-таки специфическая штука. Ну вот к примеру — для ввода-вывода используются операторы сдвига. Неожиданно, правда? Однако никто не мучается тем, что операция "сдвинуть поток на 4" не эквивалентна "умножить поток на 16". Поэтому выбор операторов для нематематических классов — дело вкусв.
Думаю, большинство современных программистов на C++ мучаются с тем, что операция вывода в поток, оказывается, может означать битовый сдвиг.
S>Для математики — да, все верно. Стоит сохранять известные тождества: S>
Давайте посмотрим. Операция конкатенации (обозначим ее через #) удовлетворяет тождествам:
a # (b # c) == (a # b) # c
a # "" == "" # a
Т.е. присутствует ассоциативность и нейтральный элемент. Коммутативности и обратного элемента нет. Знатоки алгебры, как называется такая структура? В любом случае это больше похоже на умножение, чем на сложение.
Здравствуйте, faulx, Вы писали:
F>Давайте посмотрим. Операция конкатенации (обозначим ее через #) удовлетворяет тождествам:
F>
F>a # (b # c) == (a # b) # c
F>a # "" == "" # a
F>
F>Т.е. присутствует ассоциативность и нейтральный элемент. Коммутативности и обратного элемента нет. Знатоки алгебры, как называется такая структура? В любом случае это больше похоже на умножение, чем на сложение.
А что, сложение уже не удовлетворяет этим условиям?
Здравствуйте, faulx, Вы писали:
F>Давайте посмотрим. Операция конкатенации (обозначим ее через #) удовлетворяет тождествам:
F>
F>a # (b # c) == (a # b) # c
F>a # "" == "" # a
F>
F>Т.е. присутствует ассоциативность и нейтральный элемент. Коммутативности и обратного элемента нет. Знатоки алгебры, как называется такая структура? В любом случае это больше похоже на умножение, чем на сложение.
Моноид aka "полугруппа с единицей". (N.B. не с нулем)
F>>a # (b # c) == (a # b) # c
F>>a # "" == "" # a
F>>
F>>Т.е. присутствует ассоциативность и нейтральный элемент. Коммутативности и обратного элемента нет. Знатоки алгебры, как называется такая структура? В любом случае это больше похоже на умножение, чем на сложение.
Т>Моноид aka "полугруппа с единицей". (N.B. не с нулем)
Всегда в этих названиях путаюсь. Что как минимум полугруппа, я догадался, но "моноид" — этого я уже не помню. Ну тогда вопрос, как знатоку: часто ли в математических книгах операцию в моноиде обозначают символом `+'?
Здравствуйте, faulx, Вы писали:
F>Но a + b == b + a неверно при таком обозначении, а `+' все-таки в математике обозначает коммутативную операцию.
Как говорил мой преподаватель Математического Анализа: "Вместо этого обозначения операции мы можем поставить любой своё — хоть мягкий знак". И у меня нет причин, чтобы ему не верить
Здравствуйте, Трурль, Вы писали:
Т>Здравствуйте, Mamut, Вы писали:
M>> Просто дело в том, что надо уметь работать с тем инструментом, что есть на руках.
Т>
Т>1023 IF I .EQ. 7 GOTO 1024
Т> I=I+1
Т> CALL measure
Т> GOTO 1023
Т>1024 CONTINUE
Т>
Здравствуйте, xBlackCat, Вы писали:
F>>Но a + b == b + a неверно при таком обозначении, а `+' все-таки в математике обозначает коммутативную операцию.
BC>Как говорил мой преподаватель Математического Анализа: "Вместо этого обозначения операции мы можем поставить любой своё — хоть мягкий знак". И у меня нет причин, чтобы ему не верить
Он говорит совершенно правильно. Поставить можно что угодно, и компилятору будет все равно. Только человек — не компилятор, и не все обозначения для него равнозначны. Если в каком-нибудь языке программирования операция сложения будет обозначаться символом `-', это проектное решение вызовет справедливые нарекания.
Здравствуйте, faulx, Вы писали:
Т>>Моноид aka "полугруппа с единицей". (N.B. не с нулем)
F>Всегда в этих названиях путаюсь. Что как минимум полугруппа, я догадался, но "моноид" — этого я уже не помню. Ну тогда вопрос, как знатоку: часто ли в математических книгах операцию в моноиде обозначают символом `+'?
Ни разу не видел.
Здравствуйте, Трурль, Вы писали:
F>>Всегда в этих названиях путаюсь. Что как минимум полугруппа, я догадался, но "моноид" — этого я уже не помню. Ну тогда вопрос, как знатоку: часто ли в математических книгах операцию в моноиде обозначают символом `+'? Т>Ни разу не видел.
Я так и думал. Итак, строки с операцией конкатенации образуют моноид, а операцию в моноиде не принято обозначать как `+'. Спрашивается, почему для строк должно быть сделано исключение?
faulx wrote:
> Т>Моноид aka "полугруппа с единицей". (N.B. не с нулем) > Всегда в этих названиях путаюсь. Что как минимум полугруппа, я > догадался, но "моноид" — этого я уже не помню. Ну тогда вопрос, как > знатоку: часто ли в математических книгах операцию в моноиде > обозначают символом `+'?
В высшей алгебре вообще достаточно вольно обращаются со знаками операций
Очень часто групповую/моноидную/... операцию пишут как знак плюс в
кружочке, или как умножение в кружочке. При этом никакого сходства с
обычным сложением/умножением может и не быть. Еще очень часто в процессе
доказательства теоремы кончаются свободные знаки, и начинают
использоваться всякие крестики, кружочки и т.п.