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


21

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

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


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 ++.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.