C ++ из представления Java: должно быть, я пропустил несколько вещей

Прежде всего, позвольте мне сначала пояснить, что приведенные ниже мысли являются исключительно моим личным мнением и связаны с моими ограниченными знаниями. У меня нет никаких намерений говорить, что 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-й способ ясен по значению и приемлем по эффективности, поскольку он передает данные по ссылке)

7
задан Paul Hoang 2 September 2010 в 08:33
поделиться

4 ответа

Короче говоря, вы совершенно не правы. Дело в том, что C++ предлагает ОГРОМНУЮ свободу по сравнению с Java.

Например, вы можете размещать классы в стеке. Java не предлагает этого. Вы можете вычислить определенные значения во время компиляции. Шаблоны предлагают гораздо больше возможностей, чем дженерики. У вас есть возможность сделать что-то ссылкой или значением. В Java все эти возможности выбора у вас отняты. Например, в C++ вы можете расширять более одного класса. Вы не обязаны расширять Object. Очистка детерминированных ресурсов, если хотите. Я мог бы продолжать и продолжать, и продолжать, и продолжать.

Если все, что вы делаете, это изучаете варианты синтаксиса, то вполне возможно использовать C++ приемлемым образом. Однако C++ предлагает десятки вещей, которые вы никогда не увидите в Java.

Простая истина заключается в том, что Java больше похожа на подмножество C++ с большей стандартной библиотекой, плюс отражение и генерация кода во время выполнения, я думаю.

Я предпочитаю C++, потому что Java, откровенно говоря, полон произвольных ограничений. Знаете ли вы, почему в Java нет выражения «друг»? Потому что Джеймс Гослинг считал, что это противоречит его принципам. Здорово. Это потрясающе.Теперь мне нужно разделить свою реализацию на два класса и притвориться, что это две реализации с отдельной инкапсуляцией, потому что десять лет назад он думал, что это неправильно. Это мой личный пример того, почему Java ужасный отстой: вы программируете так, как говорит Джеймс Гослинг, а не так, как вы хотите или, во многих случаях, так, как вы на самом деле должны.

Кроме того, я посмотрел на ваш PS. Вот почему у С++ есть правильный компилятор. Реальность такова, что практически все компиляторы превратят для вас первую форму во вторую, а некоторые другие умопомрачительные оптимизации, о которых вы не хотите знать, выполняются за кулисами.

6
ответ дан 6 December 2019 в 11:45
поделиться

Изучение C – лучший вариант для вас. , что вынуждает не использовать ваш образ мышления Java, и поэтому вы можете легко и легко перейти на C++.

2
ответ дан 6 December 2019 в 11:45
поделиться

Обязательно загляните на сайт 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/

2
ответ дан 6 December 2019 в 11:45
поделиться

На ваш вопрос: в грядущем C++0x будет семантика перемещения, которая должна ускорить «возврат по значению» до производительности, сопоставимой с «возвратом по ссылке». Для них не требуется изменение клиентского кода, но может потребоваться реализовать дополнительный конструктор в перемещенных классах.

О вашем Rant: Прочтите книгу Андрея Александреску «Современный дизайн C++: общие шаблоны программирования и проектирования» и удивитесь, насколько C++ и Java (и соответствующее мышление) могут отличаться.

1
ответ дан 6 December 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: