Передача параметров функции по ссылке

 

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

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; просмотров: 518;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.