Учитывая, что C ++ '11 был одобрен, это изменится, как начинающий C ++ изучает язык? [закрыто]

21

Я хотел изучить C ++ некоторое время и взял AP Computer Programming в старшей школе (тогда, когда это был C ++, а не Java). Мне нравится C, и я просто не нашел времени для изучения C ++, или просто вернусь к C #, где я гораздо более продуктивен.

У меня такой вопрос: учитывая, что C ++ '11 был одобрен (хотя я знаю, что он не полностью реализован), это изменит способ, которым я должен подходить к изучению C ++? У меня есть C ++: полный справочник Херба Шильдта, составленный в 1998 году. Делает ли недавно утвержденный стандарт изучение таких книг менее важным, чем в некоторых новых учебниках / книгах, в которых есть что-то из стандарта? Есть ли польза от изучения старых книг?

Jetti
источник
9
Уф. Schildt. Я не могу говорить о качестве его материалов C ++, но его материалы C долгое время не соответствовали стандартам (даже в самой последней версии C: TCR все еще есть несколько нетривиальных ошибок). Я бы порекомендовал поискать более свежую работу другого автора.
Джон Боде
C ++ 11 не изменил основы C ++, которую необходимо изучить, чтобы сделать все, что было представлено в последней редакции и не существует в предыдущей версии C ++.
Ramhound
11
Никогда не доверяй книге Херба Шильдта. Действительно, в то время как большинство книг по С ++ - это плохие книги (я не имею в виду здесь стилистические проблемы, а вопиющие фактические ошибки и продвижение стилей программирования, которые, как известно, приводят к ошибочному коду), книги Шильдта были настолько плохими, его имя стало чем-то вроде мема.
ВОО
4
@Ramhound: я не согласен. Если бы это было правдой, мы все равно сначала изучили бы ручное управление ресурсами, и только потом более безопасные способы создания динамических ресурсов. К счастью, это (медленно) меняется. Новые возможности, даже если они «только» в библиотеке, требуют новых идиом. Если вы начинаете с языка, зачем сначала изучать идиомы старшего возраста, а потом отучиться от них?
ВОО

Ответы:

16

Абсолютно. В эти дни три вещи, которые обычно есть в уроке 2, должны двигаться намного, намного позже:

  • строки как массивы char *, методы strlen, strxxx и т. д.
  • массивы в целом и арифметика указателей
  • удалить то, что вы новый, удалить [] то, что вы новый [], и даже деструкторы

Эти вещи, которые обычно есть в уроке 99, должны двигаться намного, намного раньше

  • шаблоны как вещи для использования (пишите, не так много)
  • станд :: строка
  • станд :: shared_ptr <>
  • std :: vector <>, итераторы, другие коллекции

Необработанный указатель Evey должен быть немедленно передан оболочке интеллектуального указателя (я бы начал с shared, а позже рассмотрим уникальный, так как он требует объяснения ссылок std :: move и rvalue). Это сделает изучение C ++ очень похожим на изучение Java или C #, где вы изучаете библиотеку одновременно с языком. Это также отнимет уйму памяти и не будет беспокоить людей.

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

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

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

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

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

Кейт Грегори
источник
3
Почему вы чувствуете, что ручному управлению памятью нужно учить позже? Я думаю, что это важно знать, и это дает большую оценку при изучении умных указателей. Мне пришлось учиться управлению памятью (и массивам символов) на C, и это заставило меня ценить RAII и std :: string гораздо больше, чем я думаю, если бы мне не пришлось это делать.
Джетти
1
Ваши примеры в основном относятся к C ++ 98 против стандартного C ++, а не C ++ 03 против C ++ 11. Я полагаю, что данная лямбда std::for_each()будет гораздо более популярной, чем раньше, autoбудет очень важна, и новый синтаксис объявления функции (вместе с decltype) станет довольно часто использоваться в коде шаблона. Это то, чему не учит нынешняя книга по С ++. Но да, в целом я согласен с вами ( +1). Когда я начал читать курсы C ++, я начал с Accelerated C ++ , и хотя мой курс начал все больше отклоняться от него, он все еще остается верным основному принципу.
ВОО
3
@Jetti: я редко когда-либо занимаюсь ручным управлением ресурсами, и если да, то для реализации классов RAII. Я, однако, использую многие из этих классов. В соответствии с этим, использование материала RAII кажется более важным, чем работа с необработанными ресурсами, и, следовательно, должно преподаваться раньше, с большим акцентом.
ВОО
1
@sbi: Я должен согласиться с вами - большинство этих примеров выглядят как Modern C ++ 101 от 2006 года, а не что-то новое в C ++ 11.
DeadMG
2
@Jetti: Самый важный шаг к освоению C ++ - это изучение всех способов избежать ручного управления памятью. Это абсолютно то, чему нужно учить «позже», как только вы узнали, как далеко вы можете пройти через «автоматическое» управление памятью.
Джалф
9

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

В 1998 году люди только начинали понимать, как писать высококачественный, безопасный и быстрый код с использованием C ++, и большая часть кода была «C was Classes». В C ++ 11 все очень по-другому - идиомы, такие как копирование и замена, и правило трех (теперь пять) хорошо известны и определены, и гораздо больше типов управления ресурсами стали стандартными, как shared_ptrи в unique_ptrтех случаях, когда предыдущие стандарты просто оставили их как зияющие дыры.

Вы можете просмотреть этот вопрос для превосходного списка справочного материала на C ++.

DeadMG
источник
1
На самом деле, я бы поставил начало конца "C с классами" на несколько лет раньше, чем в 1998 году, но в целом вы, безусловно, правы, и я бы не стал торговаться более полувека. +1от меня.
ВОО
4

Я не знаю конкретную книгу, которую вы упоминаете. Но в целом можно сказать, что все основы синтаксиса C ++, типов данных и ООП все еще верны. То же самое относится и к библиотекам 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/… .
ВОО
3

Конечно, в отношении чего-либо, связанного с технологией, быть в курсе последних событий - это всегда разумный шаг, однако изменения, внесенные в C ++ 11, призваны не раскачивать лодку. Если вы новичок в C ++ (или программировании в целом), я не буду беспокоиться об этом.

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

Лео
источник
Спасибо за ваш ответ, я подумал, что это по крайней мере поможет мне взглянуть на старый код при использовании старого ресурса.
Jetti
Как лямбда, autoи асинхронное выполнение функций могут делать что-то кроме «раскачивания»?
ВОО
1
Я бы сказал, что есть различие между введением новых инструментов и широким сдвигом в философии дизайна (как, например, мы видим с PHP)
Лев
1
@leo: я не согласен Внедрение STL, интеллектуальных указателей и многофункциональных шаблонов полностью изменило философию проектирования C ++. Почти каждая буст-библиотека полностью отличается от вашей обычной библиотеки C ++ 90-х годов.
sbi