Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

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

Содержание

1. Классы и объекты в С++. 2

1.1. Описание класса в С++. 2

1.2. Описание объектов в С++. 3

1.3. Указатель this. 4

2. Конструкторы и деструкторы.. 5

2.1. Конструкторы.. 5

2.2. Статические методы. Дружественные функции. 7

2.3. Деструктор. 8

3. Преобразование данных. Перегрузка функций и операций.. 9

3.1 Преобразование данных. 9

3.2. Перегрузка функции. 10

3.3. Перегрузка операций. 11

3.4. Перегрузка унарных и бинарных операций. 12

4. Перегрузка операций.. 14

4.1. Перегрузка операции присваивания. 14

4.2. Перегрузка операций new и delete. 14

5. Наследование. 17

5.1. Основные понятия. 17

5.2. Режимы доступа к членам базового класса. 18

5.3. Простое наследование. 19

5.4. Конструкторы и деструкторы производных классов. 20

6. Наследование (продолжение) 20

6.1. Виртуальные методы. Раннее и позднее связывание. 20

6.2. Абстрактные базовые классы.. 22

6.3. Виртуальные деструкторы.. 24

7. Множественное наследование. 25

7.1. Понятие множественного наследования. 25

7.2. Конфликт имен. 26

7.3. Порядок вызова конструкторов. 27

7.4. Виртуальные базовые классы.. 28

8. Строки в С++. 29

8.1. Основные понятия. Класс string. 29

8.2. Конструкторы, операции и методы класса string. 30

9 . Пооковые классы.. 34

9.1. Основные понятия. 34

9.2. Стандартные потоки. 35

9.3. Методы обмена с потоками. 36

9.4. Файловые потоки. 38

9.5. Строковые потоки. 39

9.6. Потоки и типы, определенные пользователем.. 40

10. Шаблоны.. 40

10.1. Основные понятия. 40

НЕ нашли? Не то? Что вы ищете?

10.2. Шаблоны функций. 41

10.3. Шаблоны классов. 42

10.4. Использование шаблонов классов. 44

11. Библиотека STL.. 45

11.1. Основные понятия. 45

11.2. Последовательные контейнеры.. 46

11.3. Ассоциативные контейнеры.. 52

12. Исключения. 53

12.1. Понятие исключения. 53

12.2. Обработка исключений. 53

12.3. Перехват исключений. 54

12.4. Исключения в конструкторах и деструкторах. 56

12.5. Иерархии исключений. 56

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

1.1. Описание класса в С++

Класс - главное инструментальное средство C++ для ООП. Класс является абстрактным типом данных, определяемым пользователем, и представляет собой модель реального объекта в виде данных и функций для работы с ними. Данные класса называются полями (по аналогии с полями структуры), а функции класса — методами (аналогичные термины «данные-члены» и «функции-члены»). Поля и методы называются элементами класса.

Описание класса: сlass имя класса{список членов};

Список членов класса определяет собственные элементы класса. При описании членов классов возможно указание атрибутов управления доступом к элементам классов. Такими атрибутами являются:

public: члены класса видны извне класса

private: соответствующие элементы могут использоваться только внутри класса

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

Поля класса:

-  могут иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс);

-  могут быть описаны с модификатором const, при этом они инициализируются только один раз (с помощью конструктора) и не могут изменяться;

-  могут быть описаны с модификатором static, но не как auto, extern и register.

Инициализация полей при описании не допускается.

Классы могут быть глобальными (объявленными вне любого блока) и локальными (объявленными внутри блока, например, функции или другого класса).

Некоторые особенности локального класса:

- внутри локального класса можно использовать типы, статические (static) и внешние (extern) переменные, внешние функции и элементы перечислений из области, в которой он описан;

- запрещается использовать автоматические переменные из этой области;

- локальный класс не может иметь статических элементов;

- методы этого класса могут быть описаны только внутри класса;

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

Пример 1.1 - класс, моделирующий персонаж компьютерной игры. Для этого зададим его свойства (количество щупалец, силу или наличие гранатомета) и поведение.

class monstr{

int health, ammo:

public:

monstr(int he = 100. int am = 10){ health = he: ammo = am:}

void drawCint x. int y, int scale, int position):

int get_health(){return health:}

int get_ammo(){return ammo:}

}:

В этом классе два скрытых поля — health и ammo, получить значения которых извне можно с помощью методов get_health() и get_ammo(). Доступ к полям с помощью методов в данном случае кажется искусственным усложнением, но надо учитывать, что полями реальных классов могут быть сложные динамические структуры, и получение значений их элементов не так тривиально. Важной является возможность вносить в эти структуры изменения, не затрагивая интерфейс класса. Все методы класса имеют непосредственный доступ к его скрытым полям (тела функций класса входят в область видимости private элементов класса).

В приведенном классе содержится три определения методов и одно объявление (метод draw). Если тело метода определено внутри класса, он является встроенным (inline). Как правило, встроенными делают короткие методы. Если внутри класса записано только объявление (заголовок) метода, сам метод должен быть определен в другом месте программы с помощью операции доступа к области видимости (::):

void monstr::draw(int х. int у. int scale, int position) {

/ * тело метода */

}

Метод можно определить как встроенный и вне класса с помощью директивы inline (как и для обычных функций, она носит рекомендательный характер):

inline int monstr::get_ammo(){

return ammo:

}

1.2. Описание объектов в С++

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

monstr Vasia: // Объект класса monstr с параметрами по умолчанию

monstr Super(200. 300): // Объект с явной инициализацией

monstr stado[100]: // Массив объектов с параметрами по умолчанию

monstr *beavis = new monstr (10): // Динамический объект

monstr &butthead = Vasia: // Ссылка на объект

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

Доступ к элементам объекта аналогичен доступу к полям структуры. Для этого используются операция «.» (точка) при обращении к элементу через имя объекта и операция «->» при обращении через указатель, например:

int п = Vasid. get_ammo();

stado[5].draw;

cout « beavis->get_health();

Обратиться таким образом можно только к элементам со спецификаторам рublic. Получить или изменить значения элементов со спецификатором private можно только через обращение к соответствующим методам.

Можно создать константный объект, значения полей которого изменять запрещается. К нему должны применяться только константные методы:

class monstr{

int get_health() const {return health;}

}:

const monstr Dead(Q,0); // Константный объект

cout « Dead.get_health();

Константный метод:

-  объявляется с ключевым словом const после списка параметров;

-  не может изменять значения полей класса;

-  может вызывать только константные методы;

-  может вызываться для любых (не только константных) объектов.

Рекомендуется описывать как константные те методы, которые предназначены для получения значений полей.

1.3. Указатель this

Каждый объект содержит свой экземпляр полей класса. Методы класса находятся в памяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов с полями именно того объекта, для которого они были вызваны. Это обеспечивается передачей в функцию скрытого параметра this, в котором хранится константный указатель на вызвавший функцию объект. Указатель this неявно используется внутри метода для ссылок на элементы объекта.

В явном виде этот указатель применяется в основном для возвращения из метода указателя (return this;) или ссылки (return *this;) на вызвавший объект.

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

    this->имя члена указывает на объект, членом, которого он является. *this представляет собой сам объект и, в зависимости от контекста, может быть лево - или правосторонней величиной this представляет собой адрес объекта.

Добавим в класс monstr новый метод, возвращающий ссылку на наиболее здорового (поле health) из двух монстров, один из которых вызывает метод, а другой передается ему в качестве параметра (метод нужно поместить в секцию public описания класса):

monstr & the_best(monstr &М){

if( health > М.health) return nhis;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18