Для початку завжди будуть проблеми, які краще вирішити однією мовою, ніж іншою. Завжди знайдуться мови, які вирішують конкретні проблеми "краще", ніж будь-яка інша мова, для певного визначення "кращого". Однак дуже велика кількість проблем має дуже схожі потреби (деякі введення / виведення, деякі обчислення) і перед ними схожі вимоги (розумна надійність, розумна ефективність).
Як ви вже знаєте C, для переважної більшості проблем, які там знаходяться, я констатую, що C ++ не забезпечує суттєвих недоліків та низку значних поліпшень. Сміливий? Деякі люди, здається, так вважають, але це дійсно так. Почнемо з очищення кількох дуже поширених непорозумінь C ++:
C ++ повільніше, ніж C. Неправильно! Багато програм C також є дійсними програмами C ++ - і така програма C повинна працювати з однаковою швидкістю, коли вона компілюється з компілятором C або компілятором C ++.
Спеціальні функції C ++ вимагають великих витрат. Неправильно! Так звані накладні витрати, запроваджені певними специфічними функціями C ++ (такими як виклики віртуальних функцій або винятки), можна порівняти з накладними накладними витратами, які ви самі ввели, якби застосувати подібну функцію в C.
C ++ - об'єктно-орієнтована. Неправильно! Мова C ++ містить деякі розширення мови, що полегшують об'єктно-орієнтоване програмування та загальне програмування. C ++ нікуди не змушує об'єктно-орієнтованого дизайну - це просто дозволяє. C також дозволяє об'єктно-орієнтоване програмування, C ++ лише робить його більш простим і менш схильним до помилок.
Отже, якщо ви мені вірите, ми встановили, що "C ++ не є значно гіршим за C". Давайте подивимось, що робить C ++ кращим C:
Більш сильне введення Система типів у C ++ є сильнішою, ніж у C. Це запобігає безлічі поширених помилок програмування - у поєднанні з наступною дуже важливою особливістю, сильніша система типу навіть не доставляє незручностей.
Параметризовані типи Ключове слово шаблону дозволяє програмісту писати загальні (типово-агностичні) реалізації алгоритмів. Якщо в C, можна написати загальну реалізацію списку з таким елементом:
struct element_t {
struct element_t *next, *prev;
void *element;
};
C ++ дозволяє написати щось на кшталт:
template <typename T>
struct element_t {
element_t<T> *next, *prev;
T element;
};
Реалізація C ++ не тільки запобігає поширеним помилкам програміста (наприклад, розміщення елемента неправильного типу у списку), але також дозволяє кращу оптимізацію компілятором! Наприклад, реалізація загального сортування доступна як для C, так і для C ++ -
порядок C визначається як:
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
тоді як програма C ++ визначається як
template void sort(RandomAccessIterator first, RandomAccessIterator last);
Різниця полягає в тому, що, наприклад, сортування масиву цілих чисел, у випадку С вимагає виклику функції для кожного порівнювання, тоді як реалізація C ++ дозволить компілятору вбудувати рядки викликів порівняння цілих чисел, оскільки фактична процедура сортування - це автоматично інстанціюється під час компіляції компілятором з правильними типами, вставленими в аргументи шаблону.
- Більша стандартна бібліотека C ++ дозволяє повністю використовувати стандартну бібліотеку C. Це дуже важливо, звичайно, оскільки стандартна бібліотека С - це неоціненний ресурс при написанні реальних програм. Однак C ++ включає бібліотеку стандартних шаблонів. STL містить ряд корисних шаблонів, як, наприклад, звичайна процедура сортування вище. Вона включає в себе корисні загальні структури даних, такі як списки, карти, набори і т. Д. Як і порядок сортування, інші підпрограми STL та структури даних "підлаштовуються" під конкретні потреби програміста - все, що програміст повинен зробити, це заповнити типи.
Звичайно, STL - це не срібна куля, але вона дуже часто допомагає при вирішенні загальних проблем. Як часто ви реалізували список на С? Як часто RB-дерево було б кращим рішенням, якби тільки ви встигли це зробити? З STL вам не потрібно робити таких компромісів - використовуйте дерево, якщо воно краще підходить, це так само просто, як використовувати список.
Гаразд, тому я обговорював лише хороші частини. Чи є якісь недоліки? Звичайно, є. Однак їх кількість зменшується з кожним днем. Дозволь пояснити:
Немає хороших компіляторів C ++. Так було вже давно. Але ви повинні пам’ятати, що мова була стандартизована в 1998 році - це складна мова, більш складна, ніж C. Потрібно тривалий час, щоб укладачі досягли стандартного рівня. Але станом на цей текст є хороші компілятори, доступні для найбільш широко використовуваних платформ; GCC у версіях 3.X, як правило, дуже хороший, і він працює на GNU / Linux та більшості платформ UNIX. Intel має хороший компілятор для Win32 - він також досить хороший, але, на жаль, він все ще покладається на MS STL, який є підпунктом.
Люди не знають гарного C ++ Це не часто чутні скарги, але я бачу багато чого. C ++ - це велика і складна мова, але вона також була мовою, яка була багато роздуто, особливо ще в дні "ООП вирішує голод, виліковує СНІД та рак". Результатом здається, що багато справді поганого коду С ++, в основному поганого С, з кількома деклараціями класу тут і там, є там і використовується як навчальний матеріал. Це означає, що багато людей, які вважають, що вони знають, що C ++ насправді пишуть справді хитрий код. Це занадто погано, і це проблема, але я думаю, що це несправедливо звинувачувати в C ++.
Отже, єдині дві основні проблеми із C ++ - це результати C ++ як молодої мови. З часом вони зникнуть. І для більшості проблем там, якщо ви можете отримати хороших програмістів (або навчитися хорошому C ++ самостійно), сьогодні проблеми насправді не є проблемою.