
- •Структуры
- •Массив структур
- •Указатели на структуру
- •Битовые поля
- •Объединения
- •Перечисления
- •Переименование типов
- •Открытие файла
- •Функции работы с файлами
- •Форматный ввод/вывод
- •Ввод/вывод строк. Функции позиционирования
- •Чтение из двоичного файла и запись в него
- •Свойства ООП
- •1.1 Свойства ООП
- •Понятие класса в С++
- •1.2 Понятие класса С++
- •Создание класса
- •1.3 Создание класса
- •Члены класса
- •1.4 Члены класса
- •Инкапсуляция
- •1.5. Инкапсуляция
- •1.6 Функции-члены класса
- •Реализация понятия «дата» при помощи структуры
- •1.7 Реализация понятия «дата» при помощи структуры
- •Реализация понятия «дата» при помощи класса
- •1.8 Реализация понятия «дата» при помощи класса
- •Определение и вызов функций–членов класса
- •Выводы. Примеры
- •1.9 Выводы
- •1.10 Пример создания класса
- •Конструкторы
- •2.1 Конструкторы
- •2.2 Пример класса без конструктора
- •2.3 Пример класса с конструктором
- •2.4. Конструктор с параметрами по умолчанию
- •2.5. Деструкторы
- •2.6. Пример класса с конструктором и деструктором
- •2.7. Подставляемые или inline функции.
- •2.8. Подставляемые функции-члены.
- •2.9. Указатель this
- •2.10. Использование указателя this
- •Дружественные функции
- •3.1 Дружественные функции
- •3.2 Пример дружественной функции
- •3.3 Дружественные классы
- •3.4. Уточнение имени элемента.
- •3.5. Определение переменных непосредственно перед использованием
- •3.6. Статические элементы класса.
- •2.7. Пример
- •Перегруженные функции
- •4. Перегрузка функций и операций
- •4.1 Полиморфизм
- •4.2 Перегруженные функции
- •4.3 Перегрузка конструктора
- •4.4 Выбор экземпляра функции
- •4.5 Перегрузка стандартных операций
- •4.6 Перегрузка операций сложения и присваивания
- •4.7 Перегрузка операций ++ и --
- •4.8 Дружественные функции-операции
- •4.9 Перегрузка операции индексации []
- •4.10 Аргументы по умолчанию
- •5. Работа с объектами
- •5.1 Ссылки в С++
- •5.2 Передача объектов, как аргументов функции
- •5.3 Массивы объектов
- •5.4 Указатель на объект
- •5.5 Динамическое выделение памяти. Операторы new, delete.
- •5.6 Локальные классы
- •5.7 Вложенные классы
- •5.8 Имена заголовочных файлов в С++
- •5.9 Строковые переменные в С++.
- •6. Наследование
- •6.1 Понятие наследования
- •6.2 Базовые и производные классы
- •6.3 Одиночное и множественное наследование
- •6.4 Управление доступом производных классов
- •6.5 Пример
- •6.6 Конструкторы с параметрами при наследовании
- •6.7 Конструкторы при множественном наследовании
- •7. Виртуальные функции. абстрактные классы
- •7.1 Указатели на производные типы
- •7.2 Виртуальные функции
- •7.3 Пример
- •7.4 Чистые виртуальные функции и абстрактные типы
- •7.5 Виртуальные базовые классы
- •7.6 Шаблоны
- •7.7 Шаблоны функций
- •7.8 Пример
- •7.9 Использование шаблонов с двумя типами параметров
- •7.10 Шаблоны классов
Перегруженные функции
4. Перегрузка функций и операций
4.1 Полиморфизм
Полиморфизм – это свойство, позволяющее использовать одно имя для обозначения действий, общих для родственных классов. При этом конкретизация выполняемых действий осуществляется в зависимости от типа обрабатываемых данных.
Формы полиморфизма в C++:
—перегрузка функций и операций
—виртуальные функции
—обобщённые функции (шаблоны).
Перегрузка функций – это использование одноимённых функций, выполняющих аналогичные действия над данными разных. Перегрузку функций и операций можно определить как статический полиморфизм, поскольку он поддерживается на этапе компиляции.
4.2 Перегруженные функции
Перегрузка позволяет задействовать одно имя для нескольких функций. Две или более функций могут иметь одно и тоже имя и отличаться количеством или типом параметров. Обычно перегруженные функции используются для реализации похожих действий над данными разного типа.
Пример:
#include <iostream>
using namespace std;
int sqr_it (int i);
float sqr_it (float d);
long sqr_it (long l);
main ()
{
int i=7; float d=1.5;
long l=36000;
cout<<sqr_it (i);
cout<<sqr_it (d);
cout<<sqr_it (l); //unsigned int u=4; //cout<<sqrt_it (u);
}
int sqr_it (int i) { return i*i; }
float sqr_it (float d)
{return d*d; } long sqr_it (long l)
{return l*l; }
Перегруженные функции не могут отличаться только типом возвращаемого значения. int sqrt_it (long i);
long sqrt_it (long i); sqrt_it (67000);
При обращении перед компилятором встаёт неразрешимая проблема, какую из перегруженных функций выбрать.
Функции, объявленные в различных областях видимости (вне пространства имён), не являются перегруженными.
void f(int); void g()
{ void f(double);
f(1); // Вызов f(double), хотя 1 – целая константа
}
4.3 Перегрузка конструктора
Перегрузка конструктора класса осуществляется просто объявлением конструкторов с различным набором параметров.
Пример. class date{
int day, month, year;
public:
date (int, int, int); date (int);
date (void); char * seazon(); int decada();
. . .
};
date::date(int a, int b, int c) {day=a; month=b; year=c;} date::date(int a)
{day=a; month=3; year=2021;} date::date(void)
{day=1; month=1; year=2000;}
. . .
date begin; date today (15);
date my_day (05,06,2003);
В зависимости от того, какие параметры заданы выбирается соответствующий конструктор.
4.4 Выбор экземпляра функции
При выборе требуемого экземпляра функции осуществляется сравнение типов и числа параметров и аргументов:
–параметры – формальные параметры функции,
– аргументы – реальные значения при вызове функций.
Существует три возможных варианта:
1.точное соответствие типов аргументов параметрам одного из экземпляров функции.
2.соответствие аргументов параметрам может быть достигнуто путём преобразования типов аргументов к типам параметров только для одного экземпляра функции. В этом
случае компилятор пытается сначала выполнить стандартные преобразования, которые определены пользователем.
3. соответствие может быть достигнуто более чем для одного экземпляра функции. При этом необходимо иметь ввиду, что преобразование типов, определённое пользователем, имеет меньший приоритет по сравнению со стандартным преобразованием. Если соответствие типов достигается путём равноправных преобразований, компилятор выдаёт сообщение об ошибке: «невозможно определить однозначно экземпляр функции».
void f1(char); |
f1(‘b’); |
void f1(unsigned int); |
f1(723); |
void f1(char*); |
f1(“Привет”); |
Здесь наблюдается точное соответствие аргументов параметрам для одного из экземпляров функций.
Преобразование типов
char, short, long ≡ int
float ≡ double
void f2(long);
void f2(char *);
f2(10); |
int –> long |
Осуществляется стандартное преобразование типов аргументов в параметр.
Замечание: аргумент любого числового типа можно преобразовать стандартным путём к любому числовому типу, любой указатель – к указателю на void.
void f3(long); |
f3(25); |
void f3(int);
void f3(short);
Преобразования типов равноправны – компилятор выдаст ошибку.
4.5 Перегрузка стандартных операций
Перегрузку стандартных операций можно рассматривать как разновидность перегрузки функций, при которой в зависимости от типов данных, участвующих в выражениях, вызывается требуемый экземпляр операции.
Как и большинство других языков C++ поддерживает набор операций для встроенных типов. Однако большинство данных, для которых обычно используются операторы, не являются встроенными типами C++, поэтому они должны быть представлены в виде