C ++ для разработчиков на C #

24

Я достаточно хорошо знаю C # (самоучка, к сожалению) и мне нужно немного программировать на C ++ для приложений Windows. Я смог найти тонну информации для разработчиков C ++, изучающих C #, но не смог найти много информации об изучении C ++, когда вы уже знаете C #. Кто-нибудь сталкивался с хорошим изложением основ?

У MSDN есть сравнение, но оно не очень глубокое.

Я могу собрать воедино несколько источников, но подумал, что что-то там было - я просто не могу найти это. Спасибо за вашу помощь.

Марк Уильямс
источник
27
Почему "грустно"? Не опускайся так. Я не знаю разработчика C #, который не является самоучкой. Многие из которых являются удивительными разработчиками.
Стивен Эверс
6
@SnOrfus - главным образом потому, что научные круги избегают его по иррациональным псевдополитическим причинам.
Рей Миясака
5
Мой первый совет - не пытайтесь изучать C ++ в контексте C #. Потому что C # не C ++, а C ++ не C #. Это может быть глупым утверждением, но C # затрудняет неправильное указание, и очень легко ошибочно делать их в C ++, даже с инструментами, которые делают его действительно простым. Я хотел бы добавить, что есть много общего между этими двумя языками. По сути, это все равно, что сказать, что яблоко и апельсин оба выращены на дереве и имеют семена, и поэтому они являются фруктами.
Ramhound
2
@ReiMiyasaka, мало чем отличается от того, как разработчики C # смотрят на VB .NET.
Kyralessa
1
@Kyralessa, что тоже довольно неудачно. Я думаю, что это не столько политический вопрос, сколько снисходительность к демографическому VB.NET - потому что большинство ранних последователей C # имеют опыт работы с C / C ++. Моя школа использовала VB.NET для начинающих. Похоже, они думают, что VB.NET - это игрушка, и поэтому она не должна так портить сознание студентов, как C #.
Рей Миясака

Ответы:

10

Этот поток на C ++ для разработчиков Java очень похож и должен быть полезен, особенно пост Марка Байера:

Прочитайте эти книги:

Вероятно, самая важная вещь, которую нужно иметь в виду, это понять разницу в методах управления памятью между C # / Java и C ++ .

Один из моих профессоров пришел из Java и преподавал вводный курс C ++, думая, что это будет торт. Ничто из того, что он объяснил, не имело никакого смысла ни для кого. У него были утечки памяти везде. Его арифметика указателя была ужасна. Он так и не попал в ООП часть учебного плана (слава богу). Практически ничего, что он продемонстрировал, не составило бы. Он не понимал, что char[]нужен страж \0. Не в конечном итоге, как он.

Рей Миясака
источник
4
Жаль, что никто в C ++ не использует char[]тогда , не так ли?
DeadMG
5
@DeadMG Я не совсем понимаю твою точку зрения. Тот char[]факт, что он редко используется в C ++, не означает, что его не учат или что его не следует учить. char[]все еще важно знать, потому что C ++ является надмножеством C, и крайне важно, чтобы он был правильно понят, если его нужно изучать вообще.
Рей Миясака
7
Да, очень, очень, очень долго после того, как они освоили все остальные аспекты языка. Я бы предпочел учить новых студентов частичным шаблонам специализаций и SFINAE. В C ++ вы используете std::string, и если вам нужно взаимодействовать с C API, то это для чего c_str(). Программисту не нужно иметь дело с char[]NULL-терминацией и ни с чем из этого. Обработка строк в стиле C полностью и полностью и полностью исключена для любого возможного использования, кроме взаимодействия со старым кодом C, который прекрасно обрабатывается c_str().
DeadMG
4
Нет такого понятия, как char[]правильное обучение , потому что все виды использования char[]неправильны. Ваш профессор, вероятно, был бы абсолютно в порядке, если бы он придерживался C ++ вместо C.
DeadMG
4
Вы будете видеть C код , используемый в C ++ писать ли вы C или не себя, и , как следствие, если вы изучаете C ++, вы должны научиться C. Как я уже говорил, я не оправдываю его, но сам факт дело в том , что школы обычно учат C и затем липкость на C ++ позже, потому что студенты должны преподаваться такие вещи , как дизайн ОС - что, за исключением BeOS и некоторых исследований операционку, абсолютно требуют C. для этого вам делать нужно понимать строки C. Опять же, в третий раз, если бы у меня был свой путь, я бы вообще не преподавал C ++ студентам первого курса, и в последний раз это совершенно не имеет значения.
Рей Миясака
14

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

DeadMG
источник
3
Это объясняет, почему там не так много. После прочтения на C ++ кажется, что вы правы - это совершенно другой мир. Спасибо за вашу помощь.
Марк Уильямс
1
+1, вы мало что знаете о C #, который даже удаленно можно перенести в C ++ . Я научился этому трудному пути.
ApprenticeHacker
Вкратце, я бы сказал, что есть много базовых C ++. Выделение указателей / ссылок и шаблонов C ++ может сначала вызвать у вас головную боль, но когда дело доходит до этого, все еще есть классы coutи простые способы достижения простых целей
Kieren Johnstone
1
@KierenJohnstone: Вы, вероятно, имеете в виду «медленные и небезопасные способы выполнения таких вещей», как «распад массива в указатель» и тому подобное.
DeadMG
12
Хороший совершенно бесполезный ответ.
dbracey
9

Это не легко исправить, C ++ не особенно сложен, но не прост для начинающих.

Я бы порекомендовал прочесть основы программирования на С (чтобы получить представление о низкоуровневом материале, который вы найдете), а затем изучить STL, а затем статьи, подобные Скотту Мейерсу. Вот один из них, с которого можно начать, поскольку он показывает, как вам следует писать на современном C ++ по сравнению с C-with-классами.

gbjbaanb
источник
2
+1: я бы добавил книги Майера (эффективная серия C ++ / STL). Я получил их все, и они потрясающие.
Стивен Эверс
12
-1 за reading up on C programming. Я думаю, что это приносит больше вреда, чем пользы, и наводит на мысль, что C и C ++ - это языки, которые необходимо изучать вместе.
Себастьян Гейгер
2
@sebastiangeiger: вы упускаете момент, когда вам приходится работать с существующими реальными приложениями C ++, вам чаще всего приходится иметь дело с C-подобными конструкциями. Следовательно +1, по крайней мере, чтобы устранить ваш пониженный голос.
Док Браун
5
@DocBrown Возможно, но я сейчас нахожусь в одном из тех устаревших проектов C ++, и я могу сказать, что мои предшественники были в основном просто программистами на C, которые сохранили свои исходные файлы как * .cpp. Я обнаружил, что я использую намного меньше deleteмассивов C и других вещей, которые не поощряются в C ++, чем они, которые я приписываю НЕ Явному изучению C. C относительно прост, вы можете довольно быстро выяснить, что делает код.
Себастьян Гейгер
3
@gbjaanb: В STL нет ничего, что требует знания mallocи free. Великий разработчик C ++ в конечном итоге захочет узнать о них. Начать с них - это совсем другое.
DeadMG
7

Я не уверен, что вы все еще ищете материалы, я нашел эту статью несколько месяцев назад. Это не книга (всего 53 страницы). Во введении сказано все:

This is a somewhat short guide to the important things to know if you are a C# programmer and find yourself needing or wanting to work in C++

http://geekswithblogs.net/mikebmcl/archive/2012/02/02/c-to-c-ndash-a-somewhat-short-guide.aspx

И есть также сообщение об обновлении тоже:

http://geekswithblogs.net/mikebmcl/archive/2012/02/14/c-to-cndasha-somewhat-short-guide-update-1.aspx

Счастливого обучения :)

Крис
источник
Будьте очень осторожны при использовании этого документа, хотя он показывает C ++ в центре внимания Microsoft (так же сказано). Он не различает функции C ++ 03 и C ++ 11, а иногда даже показывает нестандартные расширения в качестве предпочтительного решения. В результате вы получите крайне непереносимый код, если будете следовать этому руководству.
Фабио Фракасси
4
  • Обратите внимание на управление памятью. Получите четкое представление о том, как указатели и ссылки работают в C ++ в отличие от C #. Кроме того, RAII, ручное управление памятью и умные указатели наконец.
  • Шаблоны и дженерики выглядят одинаково, но это разные звери. Знайте, как работают шаблоны.
  • Есть некоторые крошечные, но броские синтаксические различия. Изучите их.
  • Вы привыкли к STL вместо .net BCL. Вы можете пропустить некоторые хорошие моменты, если у вас есть зависимость LINQ.
  • Между C ++ и C # есть некоторые принципиальные отличия. Таким образом, вы не можете просто перенести идею. Все, что вы строите с помощью C ++, вы должны создавать с нуля.
  • Удачи
Gulshan
источник
1

Я думаю, это хорошо, что вы не найдете слишком много учебников с C # до C ++. Возможно, они запутают ваш мозг. Это все равно, что сначала попытаться научиться ездить на мотоцикле, а затем переключиться на велосипед (не совсем подходящая анология, но вы понимаете). Лучше взять свежую книгу по C ++. Поскольку вы уже знакомы с концепциями ООП, вы можете пропустить длительные введения в концепции ООП (они предназначены для людей, переходящих с C на C ++). Или перейдите прямо к справочнику, предназначенному для уровня от начального до среднего или среднего уровня.

DPD
источник
1

Я бы порекомендовал пойти в Rosetta Code и сравнить их. Пока вы там, держите под рукой ссылку на идиомы C ++ и постарайтесь их обнаружить. Затем потратьте некоторое время на область указатель / ссылка / память / деструктор. После этого узнайте о препроцессоре - он действительно может быть вашим другом, когда дело доходит до сокрытия уродов, я как-то скучаю по нему. Наконец, STL.

отметка
источник
1

Итак, около года назад я был в той же лодке, что и вы: самоучка c # dev, которая чувствовала необходимость изучать C ++. Конечно, я остановился и начал несколько раз. С третьей попытки я наконец-то с этим справился.

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

Хорошая вещь в C ++ состоит в том, что выделение стека объектов по большей части довольно просто, и вы должны размещать объекты таким образом, если ваша программа будет соответствовать требованиям, указанным в этом методе. В противном случае вы полагаетесь на указатели скорости, эффективности и быстрой очистки. Я рекомендую прочитать это: http://www.parashift.com/c++-faq-lite/ поскольку это даст вам МНОГО технического понимания того, как C ++ работает под капотом.

Позволь мне привести пример:

В C ++ существует эта реализация конструктора, известная как «список инициализации», который отличается от инициализации членов класса в теле конструктора. Зачем? Поскольку, если инициализируемый тип не является примитивным, компилятор фактически создаст несколько ненужных копий объекта, создаваемого при размещении в теле ctor. Это может потенциально снизить производительность в зависимости от компилятора, а также от масштабируемых требований приложения.

Знаете, что такое делегат? Ну, в C ++ это называется указателем на функцию . Этот язык поначалу довольно сложен в освоении, но если вы хотите быть крутым ... он определенно необходим.

C # легко ... очень легко.

о пустом
источник
Делегаты C # и указатели на функции c совершенно разные. Делегат ближе к функтору в C ++, чем к указателю на функцию.
CodesInChaos
-2

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

Мухаммед Хьюди
источник
1
Кстати, изучение некоторого C раньше (указатели, массивы, структура) будет хорошо
Мухаммед Хьюди
7
Изучение C до C ++ вернет вас в каменный век. В настоящее время мы очень редко используем массивы и указатели в C ++. Язык развился от них очень давно.
fredoverflow
7
@ Мухаммед: все остальные предпочитают скорость, безопасность, простоту обслуживания.
DeadMG
3
@DPD: Ну, многие профессиональные программисты на C ++, в том числе Бьярн Страуструп (изобретатель языка), не согласны с вами. В его последней книге рассказывается об использовании объектов и шаблонов с самого начала, тогда как массивы и указатели вообще не обсуждались до главы 17 (страница 500 и кое-что).
fredoverflow
2
@DeadMG. Возможно, но вы не можете вернуть эволюцию C-> C ++. Если вы ненавидите C часть C ++, переходите на Java или C #. Лично я обнаружил, что концентрация на указателях и массивах в C перед переходом на C ++ очень помогла мне в моей карьере. Конечно, вы можете написать целое приложение без них, но если вам нужны преимущества полиморфизма, вам нужно знать указатели. Сколько важных шаблонов GoF может быть реализовано без указателей? Это было не то же самое для моих друзей, которые избегали «трудных» частей при изучении C. Большинству из них было трудно понять полиморфизм.
DPD