Прежде всего, позвольте мне сначала пояснить, что приведенные ниже мысли являются исключительно моим личным мнением и связаны с моими ограниченными знаниями. У меня нет никаких намерений говорить, что C ++ - это не круто.
Я ' Я программировал на C ++ около года и думаю, что в нем действительно есть несколько интересных функций. Тем не менее, я чувствую себя немного опустошенным и разочарованным, поскольку на самом деле я не научился никаким "изменяющим сознание" вещам из C ++ с точки зрения человека, который раньше изучал Java (как первый язык).
Судя по многочисленным сообщениям, которые я читал, люди предпочитают C ++, поскольку он быстрее. Для такого программиста, как я, который раньше не программировал критичные ко времени приложения, у меня еще не было возможности оценить это.
На данный момент все, что я узнал, мне кажется, связано с синтаксисом. Вот как мы пишем класс на Java, а вот как писать его на C ++. Вот как наследование в Java, как в C ++ и так далее. (Я знаю, множественное наследование - это круто, но для меня это не принципиально. Я думаю, что? Круто - иметь возможность ответить, почему Java не поддерживает / не может поддерживать множественное наследование, которое должно быть более общим, чем одиночное наследование).
Почему-то для меня все это просто синтаксис, и до сих пор мой ум не вырос после написания кода на C ++. Думаю, моя проблема - писать программы на C ++ с "Java-разумом". Что я действительно хочу, так это, как предлагают многие, изменить свой образ мышления после изучения нового языка. Я еще не дошел до этого с моим C ++.
Я также могу написать пару небольших программ на Python. Тем не менее, я боюсь узнать об этом больше, поскольку для меня это было бы просто изучением нового синтаксиса, нового способа делать что-то совсем другое, без знания причин.
Я планирую выучить C, чтобы по-настоящему узнавать вещи. Я думаю, это был бы довольно «вовлекающий» язык.
Дайте мне знать, что вы думаете, и дайте мне совет.
PS: Кстати, есть один конкретный вопрос по C ++, который я хочу подтвердить. В C ++ запись следующим образом неэффективна, если я прав:
private A computeAndReturnA(){...}
Вместо этого напишите это как:
private void computeAndReturnA(A& a){...}
, поскольку в первом случае возвращаемые значения копируются (когда мы назначаем b = compute .. .) и внести какие-то неэффективности? (В Java я полагаю, что 1-й способ ясен по значению и приемлем по эффективности, поскольку он передает данные по ссылке)
Короче говоря, вы совершенно не правы. Дело в том, что C++ предлагает ОГРОМНУЮ свободу по сравнению с Java.
Например, вы можете размещать классы в стеке. Java не предлагает этого. Вы можете вычислить определенные значения во время компиляции. Шаблоны предлагают гораздо больше возможностей, чем дженерики. У вас есть возможность сделать что-то ссылкой или значением. В Java все эти возможности выбора у вас отняты. Например, в C++ вы можете расширять более одного класса. Вы не обязаны расширять Object. Очистка детерминированных ресурсов, если хотите. Я мог бы продолжать и продолжать, и продолжать, и продолжать.
Если все, что вы делаете, это изучаете варианты синтаксиса, то вполне возможно использовать C++ приемлемым образом. Однако C++ предлагает десятки вещей, которые вы никогда не увидите в Java.
Простая истина заключается в том, что Java больше похожа на подмножество C++ с большей стандартной библиотекой, плюс отражение и генерация кода во время выполнения, я думаю.
Я предпочитаю C++, потому что Java, откровенно говоря, полон произвольных ограничений. Знаете ли вы, почему в Java нет выражения «друг»? Потому что Джеймс Гослинг считал, что это противоречит его принципам. Здорово. Это потрясающе.Теперь мне нужно разделить свою реализацию на два класса и притвориться, что это две реализации с отдельной инкапсуляцией, потому что десять лет назад он думал, что это неправильно. Это мой личный пример того, почему Java ужасный отстой: вы программируете так, как говорит Джеймс Гослинг, а не так, как вы хотите или, во многих случаях, так, как вы на самом деле должны.
Кроме того, я посмотрел на ваш PS. Вот почему у С++ есть правильный компилятор. Реальность такова, что практически все компиляторы превратят для вас первую форму во вторую, а некоторые другие умопомрачительные оптимизации, о которых вы не хотите знать, выполняются за кулисами.
Изучение C – лучший вариант для вас. , что вынуждает не использовать ваш образ мышления Java, и поэтому вы можете легко и легко перейти на C++.
Обязательно загляните на сайт www.boost.org, это изменит ваше мышление.
Что касается вопроса в Post Scriptum: будет ли первая форма включать копирование или нет: это зависит, и зависит от многих факторов.
В текущем C++:
Во-первых, если компилятор поддерживает RVO и особенно когда он также поддерживает NRVO, велика вероятность того, что высокая копия не будет выполнена. Затем это зависит от того, как написана функция:
A computeAndReturnA()
{
return A( x, y ); // no copy almost for sure
}
A computeAndReturnA()
{
A a;
a.f();
a.g();
return a; // no copy if compiler implements NRVO
}
A computeAndReturnA()
{
A a;
while ( condition1 ) {
a.f();
if ( condition2 )
return A(); // copy will take place
}
a.g();
return a; // copy will take place
}
Затем это зависит от того, как вы вызываете функцию:
A a1 = computeAndReturnA(); // no copy if function body written appropriately,
// return value will be constructed directly in a1
A a2;
a2.foo();
a2 = computeAndReturnA(); // copy regardless of function body,
// return value can't directly be constructed in a2
// as a2 is already constructed
В будущем C++ (март 2011?):
Применяются те же рассуждения, что и для текущего C++. Однако, если это рассуждение предполагает, что копирование будет сделано, и если класс (здесь A) имеет конструктор перемещения и оператор присваивания перемещения, то будет иметь место «перемещение», а не «копирование». В идеальных случаях перемещение будет исключено, а вы получите прямое построение, но если нет, вы получите перемещение в худшем случае, конечно, при условии, что возвращаемый класс знает о перемещении.
Думаю, эта статья будет для вас интересной и информативной: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
На ваш вопрос: в грядущем C++0x будет семантика перемещения, которая должна ускорить «возврат по значению» до производительности, сопоставимой с «возвратом по ссылке». Для них не требуется изменение клиентского кода, но может потребоваться реализовать дополнительный конструктор в перемещенных классах.
О вашем Rant: Прочтите книгу Андрея Александреску «Современный дизайн C++: общие шаблоны программирования и проектирования» и удивитесь, насколько C++ и Java (и соответствующее мышление) могут отличаться.