Торвальдс говорит из своей задницы здесь.
Хорошо, почему он говорит из своей задницы:
Прежде всего, его напыщенная речь - действительно ничто, но напыщенная речь. Здесь очень мало актуального контента. Единственная причина, по которой он действительно известен или даже слегка уважаем, заключается в том, что он создан Богом Linux. Его главный аргумент в том, что C ++ - дерьмо, и он любит злить людей на C ++. Конечно, нет никакой причины отвечать на это, и любой, кто считает это разумным аргументом, в любом случае не подлежит обсуждению.
Что касается того, что могло бы прозвучать как его самые объективные моменты:
- STL и Boost - полная чушь <- что угодно. Ты идиот.
- STL и Boost вызывают бесконечное количество боли <- смешно. Очевидно, он намеренно преувеличивает, но каково его реальное утверждение здесь? Я не знаю. Есть некоторые более чем тривиально сложные проблемы, когда вы вызываете рвоту компилятора в Spirit или что-то в этом роде, но это не более или менее трудно понять, чем отладку UB, вызванную неправильным использованием конструкций C, таких как void *.
- Абстрактные модели, поддерживаемые C ++, неэффективны. <- Как что? Он никогда не расширяется, никогда не приводит примеров того, что он имеет в виду, он просто говорит это. BFD. Поскольку я не могу сказать, на что он ссылается, нет смысла пытаться «опровергнуть» утверждение. Это обычная мантра C фанатиков, но это не делает ее более понятной или понятной.
- Правильное использование C ++ означает, что вы ограничиваете себя аспектами C. <- На самом деле код WORSE C ++ там делает это, так что я до сих пор не знаю WTF, о котором он говорит.
По сути, Торвальдс говорит из своей задницы. Там нет внятного аргумента о чем-либо. Ожидать серьезного опровержения такой ерунды просто глупо. Мне говорят «расширить» на опровержение чего-то, что я должен был бы расширить, если бы я сказал это. Если вы действительно, честно посмотрите на то, что сказал Торвальдс, вы увидите, что он на самом деле ничего не сказал.
То, что Бог говорит, что это не означает, что это имеет какой-то смысл или должно восприниматься более серьезно, чем если бы это сказал какой-то случайный бозо. По правде говоря, Бог - это просто еще один случайный бозо.
Отвечая на актуальный вопрос:
Вероятно, самая плохая и самая распространенная, плохая практика C ++ - это обращаться с ней как с C. Продолжение использования функций API C, таких как printf, gets (также считается плохим в C), strtok и т. Д., Не только не позволяет использовать предоставленную мощность из-за более жесткой системы типов они неизбежно приводят к дальнейшим осложнениям при попытке взаимодействия с «реальным» кодом C ++. Так что, в принципе, делайте прямо противоположное тому, что советует Торвальдс.
Научитесь использовать STL и Boost для дальнейшего обнаружения ошибок во время компиляции и для упрощения своей жизни другими общими способами (например, токенайзер Boost является как безопасным, так и лучшим интерфейсом). Это правда, что вам нужно научиться читать ошибки шаблона, что поначалу устрашает, но (по моему опыту в любом случае), откровенно говоря, намного проще, чем пытаться отлаживать что-то, что генерирует неопределенное поведение во время выполнения, что делает C api довольно легко сделать.
Не скажу, что С не так хорош. Мне конечно больше нравится C ++. C программисты любят C лучше. Есть компромиссы и субъективные лайки в игре. Там также много дезинформации и FUD, плавающих вокруг. Я бы сказал, что в C ++ все больше и больше FUD и дезинформации, но в этом отношении я предвзят. Например, проблемы «раздувания» и «производительности», которые, предположительно, есть у C ++, на самом деле не являются серьезными проблемами в большинстве случаев и, безусловно, выходят за рамки реальности.
Что касается вопросов, на которые ссылается ваш профессор, они не являются уникальными для C ++. В ООП (и в универсальном программировании) вы хотите предпочесть композицию наследованию. Наследование - это самое сильное из возможных отношений связывания, которое существует во всех языках ОО. C ++ добавляет еще один, более сильный, дружба. Полиморфное наследование должно использоваться для представления абстракций и отношений «есть», оно никогда не должно использоваться для повторного использования. Это вторая по величине ошибка, которую вы можете совершить в C ++, и она довольно большая, но далеко не уникальная для языка. Вы также можете создавать слишком сложные отношения наследования в C # или Java, и у них будут точно такие же проблемы.
virtual
функций, верно?