особенности синтаксиса C++
потому что new в сях не было. хочешь однообразия - добавляй круглые скобки первому аргументу - Obj;
лучше использовать вместо этого:
obj_type obj1(construct_args);
вот этот синтаксис:
obj_type obj1 = obj_type(construct_args);
по Страуструпу эти записи эквивалентны по смыслу.
имхо, лучше было сомнительные фичебаги еще кернинговских C-ей - объявить устаревшими, и поддерживать только в режиме совместимости.
Как ты предлагаешь определять, что возвращает функция?
---
"Narrowness of experience leads to narrowness of imagination."
А копирований не будет лишних?
+1
Кстати, как с этим обстоят дела в C#, Java?
Никакой обратной совместимости. Сделаны совершенно новые языки, позаимствовавшие элементы синтаксиса только на уровне идей.
Какой предложишь синтаксис указания сигнатуры функции?
---
...Я работаю антинаучным аферистом...
По идее там должен вызываться сначала конструктор, а потом копирующий конструктор. Но оптимизация этого не допустит!
Может будет, а может и не будет. Тут стандарт разрешает убрать вызов копирующего конструктора и сразу вызвать конструктор.
complex y = complex(2,0); // создает complex(2,0 затем инициализирует им y
но при практических проверках в MSVS2005 получается, что действительно вызывается обычный конструктор...
И при всех эти извращениях с синтаксисом разработчики С++ забыли добавить возможность для стековых объектов вызова конструкторов в порядке, зависящем от какого-либо условия в программе, без вызова конструкторов копирования, которые в этом случае теоретически не нужны.
зачем загромождать язык? синглетоны пишутся в две строчки
А синглтоны-то тут причем? Я хочу вызывать в разном порядке конструкторы самых обычных классов.
синглетоны тут при том, что "возможность для стековых объектов вызова конструкторов в порядке, зависящем от какого-либо условия в программе" ими реализуется, в том числе и для "самых обычных классов"
Я хочу вызывать в разном порядке конструкторы самых обычных классов
А зачем это нужно, можно поподробней?
Не синглетон, а фэктори, скорее.
C# - пока молодой, соответственно и особых проблем с совместимостью нет.
с Java-ой все проще и сложнее: у java-ы во главу угла ставится переносимость.
соответственно, общая политика разработчиков Java-ы: язык Java-а необходимо как можно меньше менять, и как можно меньше внего вводить новых языковых конструкций. Соответственно - у них нет проблем с поддержкой обратной совместимости, т.к. новые фичи просто не вводятся.
полуисключением стали лишь generic-и, в язык их ввели, но на уровне il-а их нет.
полуисключением стали лишь generic-иАга, а полным исключением стали enum'ы, т.к. есть код для jvm 1.4, где некоторые писали переменные с именем enum.
Ага, я с таким кодом сталкивался и он у меня не компилился. Был большой геморрой. Вот вам и переносимость Java.
Я думаю, что переносимость тут не при чём. Был изменён язык, потому что это реально требовалось.
Ага, я с таким кодом сталкивался и он у меня не компилился. Был большой геморрой.а рефакторинг для кого придумали? Плюс весь проект можно вычистить одним регэкспом...
Это была чужая прога и разбираться в ней никак не хотелось.
Ага, а полным исключением стали enum'ыНу, кое-какая защита всё-таки есть. Переменных с именем const или goto не создать, так что когда Java дорастёт до goto, проблем не будет
Могли все-таки сделать, что enum не был ключевым словом.
можно было даже так сделать:
class enum X
{
A,
B
}
тогда enum был бы контекстно-зависимым ключевым словом.
тогда enum был бы контекстно-зависимым ключевым словом.Конечно, они много чего могли бы сделать. Но дело в том, что Java - очень простой язык, в отличие от C#, и поэтому для него лучше было сделать enum ключевым словом с простым использованием.
Оставить комментарий
Landstreicher
Пишу программу, генерирующую код на C++. В некоторых местах нужно вставлять создание объектов, что-то типа ptr = new Obj(args). Пишу что-то в духе (код слегка изменен для наглядности):Все работает отлично. Выясняется, что в паре мест объект надо создавать не на куче, а на стеке. Нет проблем:
Опс! Оказывается в половине случаев все работает, а в другой половине — очень странные ошибки. Их внимательное разглядывает приводит к выводу, что когда аргументов 0, то "ptr = new Obj;" работает как надо, а вот "Obj obj;" объявляет функцию без аргументов.
Вопрос: почему в языке такой неоднородный синтаксис? Близкие по смыслу операцию ведут себя по разному. Почему синтаксис выделения объекта в стеке должен отличаться от синтаксиса выделения объекта в куче? Если возникают проблемы с Obj то почему тогда работает "new Obj"?