Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_K_Magistrature.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
508.41 Кб
Скачать

Программирование

1.Функции и процедуры в языках программирования.Передача параметров по значению и по ссылке.

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

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

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

Тип функции определяется типом возвращаемого значения и списком типов её формальных параметров.

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

[спецификатор-класса-памяти] [спецификатор-типа] имя-функции

([список-формальных-параметров])

{ тело-функции }

Передача параметров по значению и по ссылке.

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

2. Перегрузка операций и функции в языке С ++

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

Компилятор определяет, какую именно функцию требуется вызвать, по типу фактических параметров. Этот процесс называется разрешением перегрузки (resolution). Тип возвращаемого функцией значения в разрешении не участвует. Механизм разрешения основан на достаточно сложном наборе правил, смысл которых сводится к тому, чтобы использовать функцию с наиболее подходящими аргументами и выдать сообщение, если такой не найдется.

Пример (варианты функций, определяющие наибольшее значение):

//возвращает наибольшее из двух целых: int max(int, int);

// возвращает подстроку наибольшей длины: char* max(char*, char*);

//возвращает наибольшее из первого параметра и длины второго: int max(int, char*);

// возвращает наибольшее из второго параметра и длины первого: int max(char*, int);

При вызове функции max компилятор выбирает соответствующий типу фактических параметров вариант функции (в приведенном примере будут последовательно вызваны все четыре варианта).

Если точного соответствия не найдено, выполняются продвижения порядковых типов в соответствии с общими правилами, например, bool и char в int, float в double и т. п. Далее выполняются стандартные преобразования типов, например, int в double или указателей в void*. Следующим шагом является выполнение преобразований типа, заданных пользователем, а также поиск соответствий за счет переменного числа аргументов функций. Если соответствие на одном и том же этапе может быть получено более чем одним способом, вызов считается неоднозначным и выдается сообщение об ошибке.

Неоднозначность может проявиться при:

-преобразовании типа;

-Использовании параметров-ссылок;

-использовании аргументов по умолчанию.

-Правила описания перегруженных функций:

перегруженные функции должны находиться в одной области видимости, иначе произойдет сокрытие аналогично одинаковым именам переменных во вложенных блоках;

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

Функции не могут быть перегружены, если описание их параметров отличается только модификатором const или использованием ссылки (например, int и const in t или int и int&).

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

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

. .* ?: :: # ## sizeof

Перегрузка операций осуществляется с помощью методов специального вида (функций-операций) и подчиняется следующим правилам:

при перегрузке операций сохраняются количество аргументов, приоритеты операций и правила ассоциации (справа налево или слева направо), используемые в стандартных типах данных;

для стандартных типов данных переопределять операции нельзя;

функции-операции не могут иметь аргументов по умолчанию;

функции-операции наследуются (за исключением =);

функции-операции не могут определяться как ststic.

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

Функция-операция, первый параметр которой имеет стандартный тип, не может определяться как метод класса.

Функция-операция содержит ключевое слово operator, за которым следует знак переопределяемой операции:

тип operator операция (список параметров) {тело функции}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]