C ++ для розробників C #


24

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

MSDN має порівняння, але воно не дуже поглиблене.

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


27
Чому "сумно"? Не пускай себе так. Я не знаю розробника C #, який не самоук. Багато з яких дивовижні розробники.
Стівен Еверс

6
@SnOrfus - головним чином тому, що академія уникає його з ірраціональних псевдополітичних причин.
Рей Міясака

5
Перше моє слово - це не намагайтеся вивчити C ++ у контексті C #. Тому що C # не є C ++, а C ++ не є C #. Це може бути дурним твердженням, але C # утрудняє неправильні вказівки, і дуже легко їх робити неправильно в C ++, навіть із інструментами, які роблять це справді просто. Я хотів би додати, що є багато спільного для двох мов. Це в принципі, як сказати, що яблуко і апельсин вирощуються на дереві і мають насіння, і таким чином вони є плодами.
Рамхаунд

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, і якщо вам доведеться взаємодіяти з API API, то c_str()для цього потрібно. Ні в чому з цього не потрібно програмісту займатися char[]або припиняти NULL. Обробка рядків у стилі 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 ++, тому я не очікував би існування якогось конкретного матеріалу, який би покривав цей кут. Вам потрібно буде вчитися з нуля.


3
Це пояснило б, чому там не так багато. Почитавши на C ++, трохи здається, що ви прав - це зовсім інший світ. Спасибі за вашу допомогу.
Марк Вільямс

1
+1, про C # ви мало знаєте, що навіть віддалено переноситься на C ++ . Я навчився цього важким шляхом.
ApprenticeHacker

Як швидкий момент, я б сказав, що є багато C ++, що є основним. Розрізнення покажчиків / посилань та шаблонів C ++ може спочатку змусити вашу голову крутитися, але коли справа доходить до неї, все ще існують заняття coutта прості способи досягнення простих цілей
Kieren Johnstone

1
@KierenJohnstone: Ви, мабуть, маєте на увазі "повільні та небезпечні для винятків способи робити такі речі", як "розпад масиву-вказівника" та подібні речі.
DeadMG

12
Приємна абсолютно непомітна відповідь.
dbracey

9

Цього немає простого виправлення, C ++ не особливо складний, але для початківців це непросто.

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


2
+1: Я додам отримання книг Мейєра (ефективна серія C ++ / STL). У мене їх все, і вони приголомшливі.
Стівен Еверс

12
-1 для reading up on C programming. Я думаю, що це приносить більше шкоди, ніж користі, і охоплює уявлення про те, що C і C ++ - це мови, які потрібно вивчати разом.
sebastiangeiger

2
@sebastiangeiger: ви пропускаєте те, що коли вам доведеться працювати з існуючими реальними програмами C ++, вам найчастіше доведеться мати справу з C-подібними конструкціями. Значить, +1, принаймні, щоб усунути свій потік.
Док Браун

5
@DocBrown Можливо, але я зараз перебуваю на одному із тих застарілих проектів C ++, і можу сказати, що мої попередники були в основному просто програмістами C, які зберегли вихідні файли як * .cpp. Я виявив, що я використовую набагато менше, deleteа масиви C та інші речі, які не відволікаються на C ++, ніж вони, що я приписую НЕ явно вивченню C. C порівняно просто, ви можете швидко зрозуміти, що робить код.
sebastiangeiger

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 ++, ви повинні проектувати з нуля.
  • Удачі

1

Я думаю, що добре, що ви не знайдете занадто багато підручників C # до C ++. Можливо, вони можуть заплутати ваш мозок. Це дуже схоже на спробу навчитися спочатку їздити на мотоциклі, а потім переходити на велосипед (не цілком відповідна анологія, але ви розумієте). Краще вам взяти свіжу книгу на C ++. Оскільки ви вже знайомі з концепціями OOP, ви можете пропустити довгі введення до концепцій OOP (вони призначені для людей, що переходять з C на C ++). Або йдіть прямо за довідником, призначеним для початкового та проміжного рівнів.


1

Я порекомендував би перейти до коду Rosetta та порівняти два. Поки ви знаходитесь там, будьте в курсі ідентифікацій С ++ та спробуйте їх помітити. Потім витратьте деякий час на область покажчика / посилання / пам'яті / деструктора. Після цього дізнайтеся про препроцесора - це справді може бути вашим другом, коли справа стосується приховування угл, я якось сумую за цим. Нарешті, 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 ++, зокрема Bjarne Stroustrup (винахідник мови), не згодні з вами. Його остання книга вчить з використанням об'єктів та шаблонів з самого початку, тоді як про масиви та вказівники взагалі не розмовляють перед Главою 17 (стор. 500 та щось).
fredoverflow

2
@DeadMG. Можливо, але ви не можете повернути еволюцію C-> C ++. Якщо ви ненавидите C-частину C ++, перейдіть на Java або C #. Особисто я виявив, що зосередження на покажчиках та масивах у С перед тим, як перейти до С ++, мені дуже допомогло у кар’єрі. Звичайно, ви можете кодувати цілу програму без них, але якщо ви хочете переваги поліморфізму, вам потрібно знати вказівники. Скільки важливих моделей GoF можна реалізувати без покажчиків? Це було не те саме для моїх друзів, які уникали "важких" частин під час навчання С. Більшість із них важко зрозуміли поліморфізм.
DPD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.