Добавил:
Помощь с лабораторными, контрольными практическими и курсовыми работами по: - Инженерной и компьютерной графике - Прикладной механике Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 сем 1 курс С++ / Экзамен / Lektsii_Kurakina_2_semestr.pdf
Скачиваний:
12
Добавлен:
08.08.2022
Размер:
4.82 Mб
Скачать

Перегруженные функции

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++, поэтому они должны быть представлены в виде

Соседние файлы в папке Экзамен