Вводный курс по C++||Класс и объект C++||Наследование C++

Классы и объекты С++

Классы и объекты С++

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

Класс используется для указания формы объекта, который содержит представление данных и методы для манипулирования данными. Данные и методы в классе называются членами класса. Функции в классе называются членами класса.

Определение класса С++

Определение класса — это, по сути, схема определения типа данных. На самом деле это не определяет никаких данных, но определяет, что означает имя класса, то есть определяет, что содержит объект класса и какие операции можно выполнять над этим объектом.

Определение класса начинается с ключевого слова  class  , за которым следует имя класса. Тело класса заключено в пару фигурных скобок. За определением класса должна следовать точка с запятой или список объявлений. Например, мы определяем тип данных Box с помощью ключевого слова  class  следующим образом:

class Box
{
   public:
      double length;   // Length of a box
      double breadth;  // Breadth of a box
      double height;   // Height of a box
};

Ключевое слово  public  определяет атрибуты доступа членов класса. В рамках объекта класса общедоступные члены доступны за пределами класса. Вы также можете указать члены класса как  частные  или  защищенные , что мы объясним позже.

Определить объект C++

Классы обеспечивают основу для объектов, поэтому в основном объекты создаются на основе классов. Объекты классов объявляются так же, как и переменные примитивных типов. Следующий оператор объявляет два объекта класса Box:

Box Box1; // объявляем Box1, тип Box
Box Box2; // объявляем Box2, тип Box

Объекты Box1 и Box2 имеют соответствующие элементы данных.

члены данных доступа

Доступ к открытым членам данных объектов класса можно получить с помощью оператора прямого доступа к членам (.). Чтобы лучше понять эти концепции, давайте попробуем следующий пример:

#include <iostream>

using namespace std;

class Box
{
   public:
      double length;   // 长度
      double breadth;  // 宽度
      double height;   // 高度
};

int main( )
{
   Box Box1;        // 声明 Box1,类型为 Box
   Box Box2;        // 声明 Box2,类型为 Box
   double volume = 0.0;     // 用于存储体积
 
   // box 1 详述
   Box1.height = 5.0; 
   Box1.length = 6.0; 
   Box1.breadth = 7.0;

   // box 2 详述
   Box2.height = 10.0;
   Box2.length = 12.0;
   Box2.breadth = 13.0;

   // box 1 的体积
   volume = Box1.height * Box1.length * Box1.breadth;
   cout << "Box1 的体积:" << volume <<endl;

   // box 2 的体积
   volume = Box2.height * Box2.length * Box2.breadth;
   cout << "Box2 的体积:" << volume <<endl;
   return 0;
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:

Объем коробки 1: 210
Объем Box2: 1560

Обратите внимание, что к закрытым и защищенным членам нельзя обращаться напрямую с помощью оператора прямого доступа к членам (.). Мы узнаем, как получить доступ к закрытым и защищенным членам в последующих руководствах.

Сведения о классе и объекте

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

концепция описывать
функция-член класса Функции-члены класса — это те функции, определение и прототип которых записываются внутри определения класса, как и другие переменные в определении класса.
модификатор доступа к классу Члены класса могут быть определены как общедоступные, частные или защищенные. По умолчанию он определен как частный.
Конструктор и деструктор Конструктор класса — это специальная функция, которая вызывается при создании нового объекта. Деструктор класса также является специальной функцией, которая вызывается при удалении созданного объекта.
Конструктор копирования С++ Конструктор копирования — это специальный конструктор, который использует ранее созданный объект в том же классе для инициализации вновь созданного объекта при создании объекта.
Дружественные функции С++ Дружественные функции могут обращаться к закрытым и защищенным членам класса.
Встроенные функции С++ Встраивая функцию, компилятор пытается расширить код в теле функции в точке, где функция вызывается.
Указатель this в C++ У каждого объекта есть специальный указатель  this , указывающий на сам объект.
Указатель на класс в C++ Указатель на класс ведет себя как указатель на структуру. На самом деле класс можно рассматривать как структуру с функциями.
Статические члены классов C++ И члены-данные, и члены-функции класса могут быть объявлены статическими.

наследование С++

наследование С++

Одной из наиболее важных концепций объектно-ориентированного программирования является наследование. Наследование позволяет нам определять класс в терминах другого класса, что упрощает создание и поддержку приложения. При этом также достигается эффект повторного использования функций кода и улучшения времени выполнения.

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

Наследование представляет  собой отношение  . Например, млекопитающее — это животное, собака — это млекопитающее, следовательно, собака — это животное и так далее.

Базовый класс и производный класс

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

производный класс класса: базовый класс спецификатора доступа

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

Предположим, что есть базовый класс  Shape , а Rectangle  — его производный класс, как показано ниже:

#include <iostream>
 
using namespace std;

// 基类
class Shape 
{
   public:
      void setWidth(int w)
      {
         width = w;
      }
      void setHeight(int h)
      {
         height = h;
      }
   protected:
      int width;
      int height;
};

// 派生类
class Rectangle: public Shape
{
   public:
      int getArea()
      { 
         return (width * height); 
      }
};

int main(void)
{
   Rectangle Rect;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   // 输出对象的面积
   cout << "Total area: " << Rect.getArea() << endl;

   return 0;
} 

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:

Общая площадь: 35

Контроль доступа и наследование

Производные классы могут получить доступ ко всем незакрытым членам базового класса. Поэтому, если члены базового класса не хотят, чтобы к ним обращались функции-члены производного класса, они должны быть объявлены как частные в базовом классе.

Мы можем обобщить различные типы доступа, основанные на правах доступа, следующим образом:

доступ публичный защищенный частный
тот же класс да да да
Производный класс да да нет
внешний класс да нет нет

Производный класс наследует все методы базового класса со следующими исключениями:

  • Конструктор базового класса, деструктор и конструктор копирования.
  • Перегруженные операторы для базового класса.
  • Дружественная функция базового класса.

тип наследования

Когда класс является производным от базового класса, базовый класс может быть унаследован как  открытый, защищенный  или  закрытый  . Тип наследования определяется спецификатором доступа модификатора доступа, описанным выше.

Мы редко используем  защищенное  или  частное  наследование, обычно  открытое  наследование. При использовании различных типов наследования необходимо соблюдать несколько правил:

  • Открытое наследование (public): когда класс является производным от открытого базового класса, открытые члены базового класса также являются открытыми членами производного класса, а защищенные члены базового класса также являются защищенными членами производного класса . Закрытые члены базового класса не могут быть напрямую унаследованы производным классом, но доступ к ним можно получить, вызвав открытые и защищенные члены базового класса.
  • Защищенное наследование:  когда класс является производным от защищенного базового класса, общедоступные и защищенные члены базового класса становятся защищенными членами производного класса.
  • Частное наследование (частное): когда класс является производным от частного базового класса, общедоступные и защищенные члены базового класса становятся закрытыми членами производного класса.

множественное наследование

Множественное наследование означает, что подкласс может иметь несколько родительских классов и наследует характеристики нескольких родительских классов.

Класс C++ может наследовать элементы от нескольких классов, синтаксис выглядит следующим образом:

class <имя производного класса>:<метод наследования 1><имя базового класса 1>,<метод наследования 2><имя базового класса 2>,…
{
<тело производного класса>
};

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

#include <iostream>
 
using namespace std;

// 基类 Shape
class Shape 
{
   public:
      void setWidth(int w)
      {
         width = w;
      }
      void setHeight(int h)
      {
         height = h;
      }
   protected:
      int width;
      int height;
};

// 基类 PaintCost
class PaintCost 
{
   public:
      int getCost(int area)
      {
         return area * 70;
      }
};

// 派生类
class Rectangle: public Shape, public PaintCost
{
   public:
      int getArea()
      { 
         return (width * height); 
      }
};

int main(void)
{
   Rectangle Rect;
   int area;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   area = Rect.getArea();
   
   // 输出对象的面积
   cout << "Total area: " << Rect.getArea() << endl;

   // 输出总花费
   cout << "Total paint cost: $" << Rect.getCost(area) << endl;

   return 0;
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:

Общая площадь: 35
Общая стоимость краски: $2450

Supongo que te gusta

Origin blog.csdn.net/m0_69824302/article/details/130128567
Recomendado
Clasificación