Классы и объекты С++
Классы и объекты С++
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