C ++ из Java-представления: я, должно быть, пропустил несколько вещей - PullRequest
7 голосов
/ 01 сентября 2010

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

Ответы [ 8 ]

6 голосов
/ 01 сентября 2010

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

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

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

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

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

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

2 голосов
/ 05 сентября 2010

C ++ является гораздо более общим, чем Java, в том смысле, что, как указывалось в других ответах, он является языком с множеством парадигм, в котором Java подчеркивает только объектно-ориентированное программирование (и в то же время единственный способ сделать ООП).).

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

Если вам нужен какой-то изменяющий сознание опыт, вы должны выучить язык, который активно подчеркивает другую парадигму, а не язык, который позволяет вам выбрать любую парадигму, какую вы хотите.

Я бы предложил одну из Haskell (функциональное программирование), Erlang (необычный подход к параллелизму), Factor (программирование на основе стека), Prolog (логическое программирование), Common Lisp (CLOS и макросы), Javascript (ООП на основе прототипа, т.е. без классов).

Это, на мой взгляд, будет изменяющим сознание опытом обучения.Я бы сказал, что, хотя они поддерживают многие вещи, которые не поддерживает Java, Python и Ruby все еще довольно близки к модели Java;действительно, с фоном Java было бы довольно легко увидеть их как просто другой скин на той же модели, с немного другим синтаксисом и без объявлений типов.

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

Для краткостиобзор некоторых изменяющих сознание идей, вы можете посмотреть эти видео лекции .

2 голосов
/ 01 сентября 2010

Обязательно загляните на 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) имеет конструктор перемещения и оператор присваивания перемещения, то будет иметь место «перемещение», а не «копирование».В идеальных случаях движение будет исключено так же, как вы получите прямое построение, но если нет, то вы получите движение в худшем случае, конечно, при условии, что возвращаемый класс осведомлен о перемещении.

Iдумаю, вы найдете эту статью интересной и информативной: http://cpp -next.com / archive / 2009/08 / want-speed-pass-by-value /

2 голосов
/ 01 сентября 2010

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

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

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

Изучение языка - это не просто изучение синтаксиса, а изучение того, как думать на этом языке.

Тем не менее, C ++ - это один из языков, который дает вам столько свободы и контроля, сколько вы хотите, иногда слишком много свободы.

2 голосов
/ 01 сентября 2010

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

1 голос
/ 01 сентября 2010

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

... Причина различной идиомы в вашем примере с PS не имеет ничего общего со ссылками (которых у Java нет: у Java есть указатели на объекты, но нет ссылок; но в C ++ есть как ссылки, так и указатели) ) и все, что связано с тем, что в Java выделение памяти является относительно дешевым, тогда как в C ++ это не так (поскольку в Java стоимость выделения памяти амортизируется по всему, что виртуальная машина должна распределять в любом случае - в то время как в C ++ это не так в Java виртуальная машина гарантирует, что память в любом случае распределяется только по мере необходимости).

Таким образом, в эффективном C ++ вы видите, что люди избегают большого количества избыточных новых вызовов в тесном цикле, тогда как в Java люди могут с комфортом создавать временные объекты все, что хотят.

1 голос
/ 01 сентября 2010

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

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

1 голос
/ 01 сентября 2010

Если вы пытаетесь выучить новые языки, чтобы улучшить свои навыки программирования, возможно, попытайтесь выучить что-то, что сильно отличается от синтаксиса стиля C.Возможно, один из функциональных языков, таких как Haskell, Scala или Erlang.Это покажет вам, какими могут быть разные языки программирования, и вы начнете понимать тонкие различия между Java / C ++ / C.

В противном случае, если вы хотите решить конкретную проблему, вы можете выбрать языкдля этого.Если у вас нет чего-то критически важного для производительности, вероятно, проще придерживаться языков, собираемых мусором.Если вы не планируете заниматься разработкой для iPhone, в этом случае вам следует переключиться на Objective-C

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...