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

В C нет встроенной поддержки классов. Вместо этого C использует структуры для группировки связанных данных. Хотя структуры в C также могут содержать функции, их нельзя использовать для реализации инкапсуляции или наследования, как в C++.

Еще одно отличие состоит в том, что C++ допускает объектно-ориентированное программирование (ООП), что означает поддержку таких концепций, как наследование, инкапсуляция и полиморфизм. C, с другой стороны, является процедурным языком программирования, который не имеет встроенной поддержки концепций ООП.

Дальнейшее расширение различий между классами в C++ и C с некоторыми примерами:

  1. Инкапсуляция: классы C++ позволяют инкапсулировать данные и функции в единую сущность и предоставляют механизмы для управления доступом к этим членам. Например, вы можете определить элементы данных как закрытые или защищенные, чтобы предотвратить прямой доступ к ним извне класса. Это помогает гарантировать, что внутренняя реализация класса не подвергается воздействию внешнего мира. Вот пример:
class MyClass {
private:
  int x; // private data member

public:
  void setX(int val) { x = val; } // public member function
  int getX() const { return x; } // public member function
};

int main() {
  MyClass obj;
  obj.setX(5);
  std::cout << obj.getX() << '\n';
  return 0;
}

В этом примере член данных x объявлен как закрытый, поэтому к нему нельзя получить доступ напрямую извне класса. Вместо этого предоставляются общедоступные функции-члены setX() и getX() для управления и получения значения x.

В C нет прямой поддержки инкапсуляции, поэтому члены данных и функции должны быть объявлены отдельно и управляться вручную, чтобы обеспечить инкапсуляцию. Например:

struct my_struct {
  int x;
};

void set_x(struct my_struct* obj, int val) {
  obj->x = val;
}

int get_x(const struct my_struct* obj) {
  return obj->x;
}

int main() {
  struct my_struct obj;
  set_x(&obj, 5);
  printf("%d\n", get_x(&obj));
  return 0;
}

В этом примере структура my_struct используется для группировки связанных данных, но нет встроенного способа принудительной инкапсуляции. Вместо этого предоставляются общедоступные функции set_x() и get_x() для управления и получения значения x.

  1. Наследование: классы C++ поддерживают наследование, что позволяет одному классу наследовать свойства и поведение другого класса. Это полезно для создания новых классов, похожих на существующие классы, но с некоторыми изменениями. Вот пример:
class Shape {
protected:
  int width;
  int height;

public:
  Shape(int w, int h) : width(w), height(h) {}
  virtual int area() const { return 0; }
};

class Rectangle : public Shape {
public:
  Rectangle(int w, int h) : Shape(w, h) {}
  virtual int area() const override { return width * height; }
};

int main() {
  Rectangle rect(3, 4);
  std::cout << rect.area() << '\n';
  return 0;
}

В этом примере класс Shape определяет ширину и высоту и предоставляет виртуальную функцию area(), которая может быть переопределена подклассами. Класс Rectangle наследуется от Shape и переопределяет функцию area() для вычисления площади прямоугольника. Спецификатор доступа protected используется, чтобы сделать члены width и height доступными для подклассов, но не для внешнего мира.

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

  1. Полиморфизм: классы C++ поддерживают полиморфизм, который позволяет одной функции вести себя по-разному в зависимости от типа объекта, для которого она вызывается. Это достигается с помощью виртуальных функций и позднего связывания. Вот пример:
class Animal {
public:
  virtual void speak() const = 0;
};

class Dog : public Animal {
public:
  virtual void speak

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