Какая разница между C и С++

Я знаю, что С++ имеет понятие объектов, но C не делает. Я также знаю, что почти все, что нужно знать о C, вписывается в K и R, но библиотека С++ значительно сложнее. Однако должны быть другие большие различия.

Каковы основные различия между C и С++?

Ответ 1

Посмотрите FAQ Stroustrup здесь, в частности:

В чем разница между C и С++?

С++ - прямой потомок C, который сохраняет почти все С в качестве подмножества. С++ обеспечивает более надежную проверку типов чем C, и непосредственно поддерживает более широкий диапазон стилей программирования, чем C. С++ "лучше C" в том смысле, что он поддерживает стили программирования сделано с использованием C с лучшей проверкой типа и более значительная поддержка (без потеря эффективности). В то же самое смысл, ANSI C является лучшим C, чем K & R C. Кроме того, С++ поддерживает данные абстракция, объектно-ориентированная программирование и общее программирование (см. Язык программирования С++ (3-й Издание) "; проблемы совместимости доступны для загрузка).

Ответ 2

Язык С++ говорит, что они одинаковы:

int C = 0;
assert(C++ == C);

Ответ 3

Думаю, вы ответили на свой вопрос: Классы

Это совершенно другая парадигма дизайна. Я думаю, что путаница приходит, потому что многие люди разрабатывают программы на C++, которые в основном являются программами на С и даже не осознают этого.

Что позволяет, по слову своего создателя, Stroustrup:

Изменить: добавлены другие забавные вещи

Ответ 4

Короче говоря, C стремится стать "переносимым языком ассемблера". Это упрощает простейшие действия, позволяет делать вещи, которые отображаются почти непосредственно на базовом оборудовании, и не содержит много абстракций высокого уровня (у вас есть функции и... что об этом)

С++ пытается быть всем. Язык высокого уровня, язык низкого уровня, объектно-ориентированный язык, язык с несколькими парадигмами, язык системного программирования, встроенный язык программирования и язык разработки приложений.

Два языка действительно не имеют много общего, кроме некоторого общего синтаксиса. Программа C может компилироваться как С++ с незначительными изменениями, но она не будет иметь ничего общего с "правильным" кодом С++, написанным для языка.

Ответ 5

Здесь веб-сайт показывает "несовместимости" между c и С++:

http://david.tribble.com/text/cdiffs.htm#C++-vs-C

На самом деле существует довольно много областей, где c и С++ расходятся (в дополнение к классам, шаблону, исключениям и т.д.).

Что касается основных отличий, вот список, который хорошо его охватывает:

  • анонимные союзы
  • Классы
  • конструкторы и деструкторы
  • исключения и блоки try/catch
  • внешние связи функций (например, extern "C" )
  • перегрузка функций
  • функции-члены
  • Пространство имен
  • новые и удаленные операторы и функции
  • перегрузка оператора
  • ссылочные типы
  • стандартная библиотека шаблонов (STL)
  • классы шаблонов
  • функции шаблона

Ответ 6

С++ в основном является расширением C. Первоначально С++ назывался "C с классами", выделяя основное расширение исходного языка. Уже в то время поддерживалась перегрузка функций. С тех пор С++ приобрел исключения, иерархические пространства имен, общее программирование в виде шаблонов и, наконец, многопоточность > поддержка. Начиная с С++ 11, существует также минимальная поддержка основного языка для сборки мусора, например, сборщик мусора Boehm. Меньшие расширения включают ссылочные типы, синтаксис типов возвращаемых функций возврата, распределения памяти и освобождения, которые можно переопределить, информацию о типе времени выполнения и т.д.

Различия между C и С++, то есть между C и "подмножеством C" С++, суммированы в стандартном приложении С++ 11 C, озаглавленном "Совместимость", который составляет около 20 переполненных страниц, где раздел C1 который относится к совместимости C, составляет около 10 страниц.

Это было приложение C также в С++ 98 и С++ 03, а также приложение C также в новом новом стандарте С++ 14.


Начиная с С++ 11 в приложении C этого стандарта перечисляются следующие несовместимости между C и С++:

§C1.1 Лексические условные обозначения

Новые ключевые слова (§2.12)

Параграф относится только к С++ 11 §2.12. Следующий список был создан из этой таблицы и соответствующей таблицы в C99.

    C99                 C++11

    _Bool               
    _Complex            
    _Imaginary          
                        alignas             
                        alignof             
                        asm                 
    auto                auto                
                        bool                
    break               break               
    case                case                
                        catch               
    char                char                
                        char16_t            
                        char32_t            
                        class               
    const               const               
                        const_cast          
                        constexpr           
    continue            continue            
                        decltype            
    default             default             
                        delete              
    do                  do                  
    double              double              
                        dynamic_cast        
    else                else                
    enum                enum                
                        explicit            
                        export              
    extern              extern              
                        false               
    float               float               
    for                 for                 
                        friend              
    goto                goto                
    if                  if                  
    inline              inline              
    int                 int                 
    long                long                
                        mutable             
                        namespace           
                        new                 
                        noexcept            
                        nullptr             
                        operator            
                        private             
                        protected           
                        public              
    register            register            
                        reinterpret_cast    
    restrict            
    return              return              
    short               short               
    signed              signed              
    sizeof              sizeof              
    static              static              
                        static_assert       
                        static_cast         
    struct              struct              
    switch              switch              
                        template            
                        this                
                        thread_local        
                        throw               
                        true                
                        try                 
    typedef             typedef             
                        typeid              
                        typename            
    union               union               
    unsigned            unsigned            
                        using               
                        virtual             
    void                void                
    volatile            volatile            
                        wchar_t             
    while               while               

Тип символьного литерала изменяется от int до char (§2.14.3)

Строковые литералы, сделанные const (§2.14.5)

§C1.2 Основные понятия

С++ не имеет "предварительных определений" (§3.1).

A struct - это область в С++, а не в C (§3.3).

Имя области файла, явно объявленной как const, и явно не объявленное extern, имеет внутреннюю связь, тогда как в C она будет иметь внешнюю связь ($ 3.5).

main нельзя вызывать рекурсивно и не может иметь свой адрес (§3.6).

C разрешает "совместимые типы" в нескольких местах, С++ не выполняет (§3.9).

§C1.3 Стандартные преобразования.

Преобразование void* в тип указателя к объекту требует кастинга (§4.10).

Только указатели на объекты не const и энергонезависимые объекты могут быть неявно преобразованы в void* (§ 4.10).

§C1.4 Выражения.

Неявное объявление функций не допускается (§5.2.2).

Типы должны быть объявлены в объявлениях, а не в выражениях (§5.3.3, §5.4).

Результат условного выражения, выражения присваивания или выражения для запятой может быть lvalue (§5.16, §5.17, § 5.18).

§C1.5 Заявления.

В настоящее время недопустимо переходить через объявление с явным или неявным инициализатором (кроме всего блока, не введенного) (§6.4.2, §6.6.4)

Теперь недействительно возвращать (явно или неявно) из функции, объявленной для возврата значения без фактического возврата значения (§6.6.3).

§C.1.6 Объявления.

В С++ спецификаторы static или extern могут применяться только к именам объектов или функций. Использование этих спецификаторов с объявлениями типов является незаконным в С++ (§7.1.1).

Имя С++ typedef должно отличаться от имени класса, объявленного в той же области (за исключением того, что typedef является синонимом имени класса с тем же именем) (§7.1.3).

const объекты должны быть инициализированы в С++, но могут быть оставлены неинициализированными в C (§7.1.6).

Неявный int в С++ (§7.1.6).

Ключевое слово auto не может использоваться в качестве спецификатора класса хранения (§7.1.6.4).

Объектам типа С++ типа С++ могут присваиваться только значения одного и того же типа перечисления (§7.2).

В С++ тип перечислителя - это его перечисление (§7.2).

§C.1.7 Деклараторы.

В С++ функция, объявленная с пустым списком параметров, не принимает аргументов ($ 8.3.5).

В С++ типы не могут быть определены в обратном или параметрическом типах (§8.3.5, п. 5.3.3).

В С++ синтаксис определения функции исключает функцию "старого стиля" C (§8.4).

В С++ при инициализации массива символа с строкой количество символов в строке (включая завершающий '\0') не должно превышать число элементов в массиве (§8.5.2).

§C.1.8 Классы.

В С++ объявление класса вводит имя класса в область, где оно объявлено и скрывает любой объект, функцию или другое объявление этого имени в охватывающей области (§9.1, §7.1.3).

В С++ имя вложенного класса является локальным для его охватывающего класса (§9.7).

В С++ имя typedef не может быть переопределено в определении класса после использования в этом определении (§9.9).

§C1.9 Специальные функции-члены.

Неявно объявленный конструктор копирования и неявно объявленный оператор присваивания копии не может сделать копию volatile lvalue (§12.8).

§C1.10 Директивы предварительной обработки.

Определен ли __STDC__, и если да, то каково его значение, определены реализацией (§16.8).


Чтобы облегчить регенерацию сравнительной таблицы ключевых слов и создать уверенность в том, что указано, здесь используется программа С++ для ее создания:

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <string>
using namespace std;

#define ITEMS_OF( c )   c.begin(), c.end()

enum class Language { c, cpp };

auto compare( Language const a, Language const b )
    -> int
{ return int( a ) - int( b ); }

struct Keyword
{
    string      word;
    Language    language;

    friend
    auto operator<( Keyword const& a, Keyword const& b )
        -> bool
    {
        if( int const r = a.word.compare( b.word ) ) { return (r < 0); }
        return (compare( a.language, b.language ) < 0);
    }
};

void add_words_from(
    string const& filename, Language const language, vector< Keyword >& words
    )
{
    ifstream            f( filename );
    string              word;

    while( getline( f, word ) )
    {
        words.push_back( Keyword{word, language} );
    }
}

auto main() -> int
{
    vector< Keyword >   words;
    add_words_from( "kwc.txt", Language::c, words );
    add_words_from( "kwcpp.txt", Language::cpp, words );
    sort( ITEMS_OF( words ) );

    int const w = 20;

    int previous_column = -1;
    string previous_word = "";
    cout << left;
    for( Keyword const& kw : words )
    {
        int const column = (int) kw.language;
        int const column_advance = column - (previous_column + 1);
        if( column_advance < 0 || previous_word != kw.word )
        {
            cout << endl;
            if( column > 0 ) { cout << setw( w*column ) << ""; }
        }
        else
        {
            cout << setw( w*column_advance ) << "";
        }
        cout << setw( w ) << kw.word;
        previous_column = column; previous_word = kw.word;
    }
    cout << endl;
}

Ответ 7

Шаблоны - еще одна большая разница (в дополнение к классам/объектам). Шаблоны включают, например, типы стандартных типов контейнеров (их первый вариант использования) и (бастардованные) лямбда-выражения (boost::lambda).

С++ - гораздо больший язык (не только библиотека), чем C.

Ответ 8

Этот вопрос не имеет короткого ответа.
В целом поддержка С++:
- парадигма ООП,
- generic programminng;
- метапрограммирование матрицы;
- Абстрактные типы данных;
- Новые библиотеки и стандартные элементы поддержки функциональной парадигмы,
- другие инструменты для обеспечения максимальной поддержки вашей программы;
- Также вы можете писать программы в стиле C, но использовать компилятор С++.


Но чистый C - немного быстрее, чем С++ и более низкий уровень.

Ответ 9

Другая функция С++ имеет над C обработку исключений в виде throw... catch.

Ответ 10

С++ намного больше, чем C с классами. Существует много других концепций внутри С++, таких как шаблоны, перегрузка функций и операторов, исключения и многие другие, упомянутые здесь. Это делает С++ очень мощным и гибким, но также трудным для изучения. Это не то, что единые понятия трудно понять, а их сумма и то, как они играют вместе. Взгляните на повышение, чтобы увидеть, что все возможно сделать с С++. И я догадываюсь, что потребовалось много времени, чтобы понять, что происходит под капотом, что очень ясно в случае C.

Или вкратце: С++ намного больше, чем C с классами, или, другими словами, С++ намного больше, чем Java плюс управление памятью.

Ответ 11

В 1-й из 2-х частей С++ для программистов на C перечислены некоторые отличия, отличные от OOP:

  • Аргументы по умолчанию для функций
  • Перегрузка функций
  • Вы можете объявлять локальные переменные везде, где они нужны, а не только в начале функции (также функция C99)
  • Ссылки, как в int& x
  • Const-correctness вообще
  • Пространство имен
  • Встроенный логический тип bool, с ключевыми словами true и false (также на C99 через stdbool.h)
  • Входящее ключевое слово и связанные с ним причуды, включая неявное вложение и автоматическое вложение
  • Значительно большая стандартная библиотека, чем C