Які принципові відмінності між C і C ++? [зачинено]


41

Багато хто, як правило, пише "C / C ++", ніби це одне і те ж. Хоча вони поділяють багато подібності, вони явно не однакові.

Але які насправді принципові відмінності між C і C ++? Чи є C ++ розширеною версією C, чи є функції в C, яких немає в C ++?


2
Я подумав, що C ++ - це супер набір C
користувач

1
C ++ не покращується ... його суперсеть С ..
Джо ДФ

2
@JoeDF Це було на самому початку, але насправді "сумісний із C" зараз, що зовсім не означає те саме. Ви не кодуєте C у C ++, і не всі стандартні C сумісні зі стандартними C ++.
Клаїм

+1 Ви маєте рацію, зараз такі, як брати чи двоюрідні брати. Якщо ти знаєш про що я.
Joe DF

Відповіді:


43

Наступні моменти стосуються C ++:

  1. (визначена користувачем) система статичного типу: дозволяє статичну перевірку ваших даних та їх використання - вказує на багато легко помилок у C.
  2. мульти- "парадигма": дозволяє працювати як на C, з об'єктно-орієнтованими парадигмами, із загальними парадигмами тощо.
  3. Конструктор / Деструктор: єдиний спосіб сказати один раз, що робити при створенні чи знищенні чогось, і бути впевненим, що користувачеві не доведеться знаходити потрібну функцію та використовувати її, як у C.
  4. RAII (погано названий): вам не потрібно завжди керувати пам'яттю. Просто тримайте речі в обсязі та використовуйте розумні вказівники, що описують ваше життя протягом усього часу. Ще можна використовувати необроблені покажчики.
  5. Шаблони: краще, ніж макрос, справжня мова для маніпулювання та генерування типів до остаточної компіляції. Лише відсутня типова система (див. Поняття у майбутніх стандартах C ++).
  6. Оператор перевантажує: дозволяє описувати операції простим синтаксичним способом і навіть визначати вбудовані мови домену всередині коду С ++.
  7. Сфери імен: простори імен, класи / структури, функції тощо мають прості правила, щоб переконатися, що імена не збігаються.
  8. Система винятків: спосіб поширення помилок, який часто кращий, ніж код повернення. Насправді зворотний код хороший для доменних логічних помилок, оскільки програма повинна ним керувати. Винятки використовуються для "жорстких" помилок, що робить наступний код просто невірним. Це дозволяє зафіксувати помилки, що знаходяться вище в стеку викликів, якщо це можливо, реагувати на такий виняток (за допомогою реєстрації або виправлення стану), і при RAII, якщо він добре використаний, це не робить всю програму помилковою - якщо це зробити добре, знову.
  9. Стандартна бібліотека: C має своє, але все це "динамічно". Стандартна бібліотека C ++ майже (не потоки вводу-виводу) складається з шаблонів (контейнерів та алгоритмів), що дозволяє генерувати код лише для того, що ви використовуєте. Краще: оскільки компілятор повинен генерувати код, він буде знати багато про контекст і з задоволенням застосує безліч оптимізацій, не вимагаючи від кодера придумати його код - завдяки шаблонам та іншим речам.
  10. const-правильність: найкращий спосіб переконатися, що ви не змінюєте змінних, яких не слід. Дозволяє вказати доступ до змінних. І перевіряється лише під час компіляції, щоб не було витрат на виконання.

31

C ++ був винайдений для управління складністю, з якою C не впорався. Наприклад, поширеною проблемою з C було те, що у вас можуть "закінчитися імена змінних" (що не слід сприймати буквально), оскільки не було капсулювання, просторів імен тощо.

Також у C немає винятків, тому обробка помилок дуже схильна до помилок, оскільки від користувача бібліотеки завжди перевіряти значення повернення функцій, тоді як, за винятком, розробник бібліотеки просто викидає виняток, який гарантує, що потік програми буде зупинений.

C ++ допомагає, будуючи конструктор init об'єктів, який автоматично викликається компілятором. На відміну від C структур, які потрібно ініціалізувати програмістом (звідси інша область, схильна до помилок).

Нарешті, існує багато інших переваг, на які рекламується OOP, такі як повторне використання об'єктів, а також загальні концепції, засновані на програмуванні, такі як шаблони та дженерики, які дозволяють повторно використовувати вихідний код тощо.

І ще багато інших речей, які б зайняли занадто багато мого часу, щоб перерахувати тут.


Мені подобається, що ви пишете про C ++ конструктор проти C конструкцій, і що він схильний до помилок. Я з цим згоден. Але мені не подобається Java-спосіб використання цього в JavaBeans, який завжди використовує порожній конструктор, а потім встановлює поля учасників із сеттерами. На мій погляд, це так само схильне до помилок, як і С структури. Я вважаю за краще встановлювати свої Java-об'єкти тільки за допомогою конструктора. Дивіться моє запитання щодо StackOverflow з цього приводу.
Йонас

Ви маєте там точку, але мою відповідь тут було зосереджено на C проти C ++.
Яс

1
О, давай, хто заважає тобі використовувати OOP з C? Ви можете повторно використовувати об’єкти і робити що завгодно, навіть винятки. Про це навіть є книга, яка називається OOP програмуванням в C.

2
@Vlad, жодне з того, про що ти говориш, не було варіанту 25 років тому.
Жас

4
Ви МОЖЕТЕ робити OOP майже в кожній мові програмування, яка все ще використовується, але це не означає, що мова була призначена для цього. Візьмемо, наприклад, Луа. Хоча це технічно дозволяє OOP, здається, існує близько п’ятдесяти різних способів зробити це причиною сильного головного болю.
tyjkenn

15

Загалом, все, що існує в C, підтримується в C ++. Очевидно навпаки абсолютно неправдиво.

Простіше кажучи, C ++ орієнтована на об'єкти (так, наприклад, у вас є класи), C - ні.

C ++ має булевий тип C89.

Вони різні мови. Вони просто поділяють більшу частину синтаксису.


4
C99 має булевий тип (названий _Boolз boolпсевдонімом).
Джеррі Труну

1
Це не зовсім вірно. Наприклад, C99 має long longтип даних, який ще не є частиною ISO C ++.
Chinmay Kanchi

11
Помилка ... C ++ - це не лише об'єктно-орієнтований: ви можете використовувати об'єктно-орієнтовані парадигми з C ++, оскільки мова надає особливості для цього, але також надає функції і для інших парадигм. Слід зазначити, що це дійсно важливо, воно все змінює. Якби не так, ми б усі перейшли на Java ...
Клаїм

4
У C багато конструкцій, які не працюють у C ++.

1
@klez: так - але це все-таки неправильно. У той час як ANSI спочатку розробляв C89 (у якого не було булевого типу), тепер розробку проводить ISO, і ANSI приймає стандарт ISO, тому діючий стандарт ANSI C є ідентичним поточному стандарту ISO C (який має булівський тип).
Джеррі Труну

8

У C99 є кілька функцій, які не існують (принаймні в абсолютно однаковій формі) в C ++ (наприклад, гнучкі елементи масиву, масиви змінної довжини тощо)

C99 також багато додав до бібліотеки, якої немає у стандарті C ++ 98/03; більша частина цього була додана до C ++ 11, хоча.

Щодо базової орієнтації, C в основному підтримує структуроване процедурне програмування. C ++ підтримує це, а також об'єктно-орієнтоване програмування, загальне програмування та метапрограмування (проведення довільних обчислень під час компіляції). З C ++ 11 він додає декілька біт і фрагментів, які, принаймні, можуть бути помилково сприйняті і для підтримки функціонального програмування (наприклад, лямбда-вирази). C ++ 14 додав ще декілька, але більшість із них справді більше зручності, ніж будь-яка значна зміна орієнтації.


1

Особисто я вважаю, що шаблони є найбільш значущою особливістю, яку C ++ додає до C.


1
Е, як щодо занять із спадщиною? Це справді важка робота в C, тоді як багато шаблонів можна зробити за допомогою препроцесора Макроси.
JBRWilkinson

4
Препроцесорні макроси не є безпечними для типу; це чиста текстова підміна, яка також робить налагодження важче. Щоб отримати базові класи та успадкування на роботі, це не велика робота в C. + Ви можете зробити власну модель метаоб'єкту, а не застрягти з тим, що обрав би для вас мовний дизайнер. Дивіться, наприклад, цей документ: arxiv.org/abs/1003.2547
zvrba

2
Мій голос буде деструктором за найбільш важливу особливість, яку C ++ має над C (навіть над конструкторами через їхні дивовижні можливості очищення).
Томас Едінг

@zvrba #define GENERATE_INTERFACE(T) T T##_func(T x);; (тип) безпечне перевантаження / шаблони в C. Я погоджуюся з Томасом, що деструктори є набагато важливішою особливістю C відсутня. Але деструктори часто приховують важливий код. На мою думку, простори імен (область) - найважливіші.
YoYoYonnY
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.