Передача параметров функции по ссылке
В С++ появилась возможность передачи в функцию аргументов по ссылке. Это может быть использовано в двух случаях:
1) для передачи в функцию больших структур, чтобы избежать копирования аргументов в стек;
2) для передачи в функцию аргумента, который должен быть изменен функцией.
Правда, для обоих этих случаев можно воспользоваться указателем и передавать в функцию либо указатель на структуру (в первом случае), либо указатель на модифицируемый аргумент (второй случай). Но использование указателя влечет за собой дополнительные неудобства:
1) в функции для данного параметра надо выполнять операцию разадресации;
2) при вызове функции необходимо передавать адрес аргумента, а не сам аргумент.
Все эти неудобства устраняются использованием ссылки в качестве параметра.
Например, функция, меняющая местами два целых числа, в Си имеет вид:
void swap( int* a, int* b)
{
int temp = *a; // Требуются операции
*a = *b; // разадресации
*b = temp;
}
Вызов функции:
int x = 5, y = 17;
swap( &x, &y); // необходимо передавать адрес
Используя ссылки, эту функцию можно переписать в виде:
void swap( int &a, int &b)
{
int temp = a; // знак операции * не требуется
a = b;
b = temp;
}
main()
{
void swap( int&, int&);
int x = 5, y = 17;
swap( x, y); // знак операции & не требуется
При использовании ссылок в качестве передаваемых параметров есть два существенных недостатка.
Первый недостаток заключается в том, что фактический аргумент, переданный в функцию по ссылке, может быть изменен функцией без ведома вызывающей программы.
Второй недостаток передачи параметра в функцию по ссылке проявляется, если при вызове функции фактический аргумент не соответствует типу формального параметра. В этом случае С++ будет выполнять преобразование типа. Но для ссылок преобразование типа выполняется через создание промежуточной переменной. При выполнении операций с промежуточной переменной могут возникнуть трудно уловимые ошибки. Поэтому надо быть очень осторожным в использовании ссылок в функциях и без особой нужды их не применять.
Перегрузка функций
Совершенно новым средством языка С++ является возможность определять в программе несколько функций с одним и тем же именем (в Си все имена функций должны быть уникальны). Такая возможность очень полезна, когда в программе одни и те же операции должны быть выполнены над данными различных типов.
В С++ допускается определение нескольких функций с одинаковым именем при условии, что их сигнатуры различаются. Сигнатурой для функции являются количество и типы принимаемых параметров. Значит, перегружаемые функции должны отличатся либо по количеству, либо по типам параметров.
void swap( int&, int&);
void swap( double&, double&);
void swap(char&, char&);
Здесь объявлены три экземпляра перегружаемой функции, которые будут выполнять одинаковые действия, а именно менять местами, значения двух переменных, но каждая функция работает с данными разных типов. Далее в программе определены все три функции, например, так:
void swap( int&, int&)
{
int temp = a;
a = b;
b = temp;
}
void swap( double&, double&)
{
double temp = a;
a = b;
b = temp;
}
void swap(char&, char&)
{
char temp = a;
a = b;
b = temp;
}
Теперь для пользователя достаточно знать, что есть функция swap, которая может менять местами два данных, либо целых, либо символьных, либо плавающих двойной точности.
Компилятор при вызове функции по типу и количеству фактических аргументов определит, вызов какой функции нужно встраивать.
Дата добавления: 2017-01-29; просмотров: 584;