Хороших ответов уже много. Мой будет более "ориентированным на мышление".
Данные против действий!
- В C все делается, чтобы думать как «Применить этот эффект к этим данным».
- В C ++ это больше похоже на «Данные должны вести себя».
В то время как «Данные должны вести себя» могут быть выполнены в C (и это делается!), В C ++ все, что необходимо для реализации этого, легко доступно: инкапсуляция, конструкторы, перегрузка, шаблоны и т. Д.
Я нашел эту идею "Данные должны вести себя" очень хорошим руководящим принципом при кодировании на C ++.
C ++ синтаксический сахар не является обязательным
Вы найдете множество функций C ++, которые могут быть реализованы в C, и некоторые люди используют это как предлог, чтобы не изучать их. Такое мышление опасно (это часть " трактует C ++ как новый язык, а не расширение ", встречающееся в некоторых постах).
Побочным эффектом отказа от написания C ++ способом C ++ является то, что хотя разработчик C ++ должен понимать код C ++, он / она не должен понимать вашу маленькую личную среду, имитирующую сахар C ++ с функциями только C. На самом деле, он / она не будет заинтересован вашей структурой. По правде говоря, он / она будет чувствовать к вам жалость / презрение, потому что вы потеряли драгоценное время, производя это. В конечном счете, он / она будет ненавидеть вас, если он / она будет использовать вашу среду вместо сахара C ++.
Руководящие принципы, такие как «Я могу сделать это по-С», просто заставят вас пропустить вагон. Лучше вообще не начинать изучать C ++, если у вас уже есть этот тип C-центрического мышления.
Ваш язык никогда не бывает лучшим. ВЫ должны стать лучшими. Если вы пишете код на C ++, то пишите его на C ++.
C-совместимый код C ++ - это семантическая ошибка
Тип-определение ваших структур для их компиляции компилятором C - плохая шутка. Использование указателей вместо ссылок - это пощечина вашему будущему я. extern "C"
только сделает ваш код слабее, а не сильнее. А использование void *
для универсальности только увеличит количество коллег-программистов на C ++, которые с радостью заплатят за то, что ваша голова будет удалена невероятно болезненным способом.
Никогда не пытайтесь писать C-совместимый код, если вам действительно не нужно действительно .
Вы просто утяжелите себя трудоемким стилем кодирования для функции, которую вы никогда не будете использовать.
Компилятор - сильный друг / враг
Работа на низком уровне странно влияет на некоторых разработчиков. Они очень верят в свой контроль над скомпилированным кодом. Делегировать этот контроль конструкциям более высокого уровня трудно для них.
Хорошим примером этого является отказ от шаблона конструктора / деструктора, потому что " иногда конструкторам отнимает слишком много времени ... Лучше сделать это по-моему ... ".
Компилятор C ++ вполне способен оптимизировать явно неоптимизированный код. На самом деле код, созданный компилятором, может сильно отличаться от того, который, как вы считаете, вы создали.
Не пытайтесь быть лучше / умнее компилятора, потому что:
- Вы, вероятно, уже проиграли, так как даже старые компиляторы обычно будут генерировать лучший код, чем вы можете мечтать сделать сегодня
- Даже если вы выиграли бой сегодня, он автоматически превратится в поражение завтра, так как компиляторы будут становиться все лучше и лучше в будущем, поэтому ваш «оптимизированный код» сегодня станет узким местом программы и предметом рефакторинга. последующие годы (не говоря уже о позорных воспоминаниях для вас).
Итак, доверьтесь своему компилятору.
Не управляйте созданием вашего кода на микроуровне. Выполняйте свою работу, и пусть компилятор сделает это самостоятельно.
Обратите внимание, что этот пункт не должен использоваться для оправдания создания медленного / неэффективного кода. Если преждевременная оптимизация является корнем всего зла, вы все равно должны использовать свои знания языка и компилятора для создания хорошего и эффективного кода (см. Следующий пункт).
Знайте преимущества / недостатки / затраты каждой конструкции C ++
Например, тот факт, что виртуальные методы добавляют одно косвенное значение к вызову функции, означает для некоторых людей, что производительность резко снизится. Правда в том, что проблемы с производительностью часто возникают в других местах.
Невежество не освобождает от ответственности.
Знать код, созданный для каждой конструкции C ++ (т. Е. Встраивание, ссылки, конструктор, деструктор, исключение, перегрузка функции, переопределение функции, шаблон, виртуальная функция и т. Д.). Знайте, что будет оптимизировано, а что нет.
Таким образом, вы не только не будете платить за то, что вам не нужно (это руководящий принцип C ++), но вы также получите прибыль от того, что стоит вам ноль, но приносит вам много.
Будь скромным
Есть люди, проводящие исследования в C ++, которые были лучше в C ++ в день своего рождения, чем большинство из нас когда-либо. Даже если мы игнорируем Страуструп , такие имена, как Мейерс , Абрахамс , Александреску , Саттер и т. Д. Регулярно обрезаются наряду с новыми идеями. Несмотря на (или как следствие) свой внешний взгляд, STL - революционная библиотека. А библиотека, подобная Boost , несмотря на ее «небольшой размер» по сравнению с некоторыми законченными средами (например, Java или .NET API), представляет собой массивный репозиторий отличного кода, предлагаемого вам для изучения.
Только потому, что вы нашли какую-то новую функцию "странной" или "чужой", не стоит недооценивать ее. Пытаясь понять это, PERHAPS предоставит вам другой инструмент в вашем распоряжении, и ВСЕГДА увеличит ваше владение языком, и ВСЕГДА заставит ваш мозг работать, что хорошо в бизнесе разработчиков.
Большинство людей, которых я знаю, которые потерпели неудачу в своем «преобразовании в C ++», просто предполагали, что эта или эта функция бесполезна, потому что они не удосужились ее понять.
Если ты не знаешь, что это такое, учись.
Без RAII ваш код C ++ является просто ошибочным кодом, который позволяет избежать ошибки компиляции.
RAII является единственным наиболее важным понятием C ++.
Все остальное связано.