З огляду на те, що C ++ '11 було затверджено, чи зміниться це, як вивчає мову початківець C ++? [зачинено]


21

Я хотів деякий час вивчити C ++ і взяв програму AP для комп’ютерного програмування у середній школі (тоді, коли це був C ++, а не Java). Мені подобається C і просто не знайшов часу вивчити C ++ або я просто відпаду на C #, де я набагато продуктивніший.

Моє запитання таке: враховуючи, що C ++ '11 було затверджено (хоча я знаю, що не реалізовано повністю) чи це змінить спосіб я повинен підходити до вивчення C ++? У мене є C ++: Повна довідка Герба Шильдта, яка починається з 1998 року. Чи нещодавно затверджений стандарт робить навчання з таких книг менш важливим, ніж деякі нові підручники / книги, які включають речі зі стандарту? Чи є користь від вивчення старих книг?


9
Вихід. Шильдт. Я не можу говорити про якість його матеріалів на C ++, але його матеріали на C тривалий час були нестандартними (навіть в останньому виданні C: TCR все ще є кілька нетривіальних помилок). Я рекомендую шукати більш актуальну роботу іншого автора.
Джон Боде

C ++ 11 не змінив основ C ++, які необхідно засвоїти для того, щоб зробити все, що було введено під час останньої редакції і не існує в попередній версії C ++.
Рамхаунд

11
Ніколи не довіряйте книзі Герба Шильдта. Дійсно, хоча у більшості книг на C ++ є погані книги (і я тут не маю на увазі стилістичні проблеми, але кричущі фактичні помилки та пропагування стилів програмування, добре відомих, що призводять до баггі-коду), книги Шильдта виявилися такими надзвичайно поганими, його ім'я стало дещо мемом.
sbi

4
@Ramhound: Я не згоден. Якби це було правдою, ми все-таки спочатку вивчимо керування ресурсами вручну, а вже потім безпечніші способи робити динамічні ресурси. На щастя, це (повільно) змінюється. Нові можливості, навіть якщо вони є "лише" в бібліотеці, вимагають нових ідіом. Якщо ви почнете з мови, навіщо спочатку вивчати старі ідіоми, лише щоб потім їх вивчити?
sbi

Відповіді:


16

Абсолютно. У ці дні три речі, які зазвичай проходять на уроці 2, повинні рухатися набагато пізніше:

  • рядки як масиви char *, методи strlen, strxxx тощо
  • масиви загальної та вказівної арифметики
  • видаліть нове, видаліть [] те, що ви нового [], і навіть деструктори

Ці речі, як правило, на уроці 99, повинні рухатися набагато, набагато раніше

  • шаблони як речі для використання (писати, не так багато)
  • std :: string
  • std :: shared_ptr <>
  • std :: vector <>, ітератори, інші колекції

Evey необроблений вказівник повинен бути негайно наданий обгортці інтелектуального вказівника (я б почав із загального доступу, а пізніше розглянемо унікальний, оскільки він вимагає пояснення посилань std :: move та rvalue). Це дозволить вивчити C ++ дуже схоже на вивчення Java або C #, де ви вивчаєте бібліотеку одночасно з мовою. Це також забере багато роботи з пам’яттю, а людей менше турбуватиметься за ґетчі.

Я б також працював лямбда в картину, коли ми вперше хотіли повторити колекцію і зробити щось для кожного елемента.

Відмова: Я зараз пишу курс C ++ для Pluralsight і використовую такий підхід. Останній модуль - «розуміння чужого коду», і саме там я поміщую заплутані речі, такі як рядки char *, ручне управління пам’яттю, арифметика вказівника тощо.

Оновлення: кілька людей запитують, чому існування C ++ 0x надихає на викладання речей, які можна було б навчити за допомогою C ++ 03. Я думаю, що це ряд речей:

  • по-справжньому розумні покажчики, які є зручними для колекціонування, забирають потребу в таких речах, як "масив покажчиків співробітників", які змушували нас завжди потрапляти на нові / видалення, арифметичні вказівники тощо
  • auto забирає біль ітераторських оголошень
  • лямбди змушують проповідувати те, що робила звичайна людина
  • навіть щось настільки тривіальне, як синтаксичний аналіз >>правильно виключає ґутчу, яка була б там при оголошенні деяких шаблонів шаблонів.
  • і так далі

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


3
Чому ви вважаєте, що ручному керуванню пам'яттю слід навчати пізніше? Я думаю, що це важливо знати, і це дає більше вдячності під час вивчення розумних покажчиків. Мені довелося вивчити управління пам'яттю (та масивами char) в C, і це змусило мене цінувати RAII і std :: string набагато більше, ніж я думаю, якби мені не довелося цього робити.
Jetti

1
Ваші приклади здебільшого стосуються C ++ 98 проти попереднього стандарту C ++, а не C ++ 03 проти C ++ 11. Я думаю, що дана лямбда std::for_each()буде набагато популярнішою, ніж раніше, autoбуде дуже важливою, і новий синтаксис декларації функції (спільно з decltype) стане досить широко використаний у коді шаблону. Це речі, до яких не навчається нинішня книга С ++. Але, так, загалом я згоден з вами ( +1). Коли я почав давати курси на C ++, я почав з прискореного C ++ , і, хоча мій курс почав все більше і більше відхилятися від нього, він все ще відповідає правильному принципу.
sbi

3
@ Jetti: Я рідко коли-небудь займаюся ручним управлінням ресурсами, і якщо це зробити, це для реалізації класів RAII. Я, однак, використовую багато з цих занять. Відповідно, використання матеріалів RAII видається важливішим, ніж поводження з сировинними ресурсами, і тому слід навчатись раніше, з більшим акцентом.
sbi

1
@sbi: я маю згоду з вами - більшість із цих прикладів виглядають як "Сучасний C ++ 101" 2006 року, нічого нового про C ++ 11.
DeadMG

2
@Jetti: Найважливіший крок до освоєння C ++ - це вивчення всіх способів уникнути ручного управління пам’яттю. Це абсолютно те, чого слід навчити «пізніше», як тільки ви дізнаєтесь, як далеко ви можете пройти через «автоматичне» управління пам’яттю.
jalf

9

Досить, так. Простий факт полягає в тому, що в C ++ 98 і 03 багато добрих практик були принципово непридатними через низьку якість мовної підтримки, наприклад, функціонального програмування. Тепер, коли лямбди існують і працюють, люди, як правило, сприймають функціональні інтерфейси набагато краще, ніж раніше, а загальне програмування навіть сильніше, ніж раніше.

У 1998 році люди лише починали розкривати, як писати якісний, безпечний, швидкий код за допомогою C ++, і багато коду було "C - це класи". У C ++ 11 це дуже різні ідіоми, такі як копіювання та своп, Правило трьох (тепер п'ять), добре відомі та визначені, і набагато більше типів управління ресурсами стали Стандартними, як shared_ptrі unique_ptrде попередні Стандарти просто їх залишили як зазіхаючі отвори.

Ви можете переглянути це питання для відмінного списку довідкових матеріалів на C ++.


1
Насправді я б поклав початок кінця "C з класами" на кілька років раніше, ніж 1998 року, але загалом ти, звичайно, маєш рацію, і я б не торгувався понад пів десятиліття. +1від мене.
sbi

4

Я не знаю конкретної книги, яку ви згадуєте. Але в цілому ви можете сказати, що всі основи синтаксису C ++, типів даних та OOP як і раніше справедливі. Те ж саме має стосуватися бібліотек STL, які згадуються в більшості книг для початківців.

Хоча книга, стара від 1998 року, можливо, пропустила кілька оновлень та розробок у стилі програмування на C ++, які накопичились у громаді протягом багатьох років. Я б шукав трохи більше сучасних ресурсів. Існує більш ніж достатньо безкоштовних онлайн-навчальних посібників та документів, які повинні забезпечити вам хороший старт. Деякі з них можуть навіть згадати C ++ 0x.

C ++ 0x напевно багато змінить про те, як програмісти бачать та використовують мову в майбутньому. Але це вплине на більш складні проекти, де нові функції починають мати сенс. Для початківця це не має значення, і ви можете зосередитись на задоволенні існуючих концепцій, цього вже достатньо, щоб навчитися. Більшість книг для початківців, наприклад, не надто заглиблюються в шаблони, тому нові різноманітні шаблони - це не те, що вам потрібно знати зараз.

Можливо, подивіться список змін . Принаймні кілька концепцій, таких як діапазон, заснований на циклі , швидше за все з’являться в нових підручниках навіть для початківців. Тож варто придивитися.


Спасибі! Чи знаєте ви про якісь гідні ресурси в Інтернеті чи книги?
Jetti

2
Ні, сайт cplusplus часто згадується як ресурс, який ніколи не повинен згадуватись ні перед ким, хто б хотів насправді написати хороший код.
DeadMG

@DeadMG У вас є альтернативний веб-сайт?
TheLQ

@TheLQ: Ви отримаєте додаткову інформацію про посилання MSDN або cprogramming.com.
DeadMG

@ Jetti: Я не знаю жодного матеріалу для використання C ++ 11 для навчання C ++. Все, що я бачив, вчить C ++ 11 поверх C ++ 03. Для вивчення останнього см stackoverflow.com/questions/388242 / ... .
sbi

3

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

Крім того, якщо ви професійний програміст, ви можете зробити ставку, що в майбутньому ви будете працювати над чужим кодом, тому завжди розумієте, як все працює, навіть якщо це на практиці амортизована техніка.


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

Як виконання лямбда- autoта асинхронного виконання функцій може робити що-небудь, окрім як «розгойдувати човен»?
sbi

1
Я стверджую, що існує різниця між впровадженням нових інструментів та широким зрушенням у філософії дизайну (як, наприклад, у PHP)
лео

1
@leo: Я не згоден. Впровадження STL, розумних покажчиків та багатих можливостей для шаблонів повністю змінило основну філософію дизайну C ++. Практично кожна бібліотека розширення абсолютно відрізняється від середньої бібліотеки C ++ 90-х років.
sbi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.