- •Функции, часть 2:
- •-Ссылка — это неявный указатель.
- •Два способа передачи аргументов
- •2. При вызове по ссылке функции передается адрес аргумента.
- •void swap(int *х, int *у)
- •Результаты выполнения этой программы
- •Ссылочные параметры
- •При использовании ссылочного параметра функции автоматически передается адрес (а не значение) аргумента.
- •При выполнении этой программы получаем такой результат.
- •Инструкция
- •void swap(int &х, int &у)
- •Присваивая некоторое значение ссылке, вы в действительности присваиваете это значение переменной, на которую
- •Объявление ссылочных параметров
- •Некоторые программисты определяют в таком стиле и указатели, связывая символ "*" с типом,
- •Подобное связывание символа "&" или "*" с типом (а не с переменной) не
- •Возврат ссылок
- •Вот как выглядят результаты выполнения этой программы.
- •Результаты ее выполнения таковы.
- •//Здесь ошибка: нельзя возвращать
- •Создание ограниченного массива
- •// Функция занесения значения в массив. int &put(int i)
- •Результат, полученный при выполнении этой программы, выглядит так.
- •Независимые ссылки
- •Ограничения при использовании ссылок
- •Перегрузка функций
- •void f(int i)
- •При выполнении эта программа генерирует следующие результаты.
- •Чтобы лучше понять выигрыш от перегрузки функций, рассмотрим три функции из стандартной библиотеки:
- •// Создание функций myabs() — перегруженной версии функции abs().
- •int myabs(int i)
- •Результаты выполнения этой программы таковы.
- •Принципиальная значимость перегрузки состоит в том, что она позволяет обращаться к связанным функциям
- •Благодаря полиморфизму программисту нужно помнить не три различных имени, а только одно.
- •Анахронизм в виде ключевого
- •Аргументы, передаваемые функции по умолчанию
- •Чтобы предусмотреть максимально возможное количество ситуаций и обеспечить их корректную обработку, функции часто
- •Аргумент, передаваемый функции по умолчанию, представляет собой
- •При создании функций, имеющих значения аргументов, передаваемых по умолчанию, необходимо помнить, что значения
- •Важно понимать, что все параметры, которые принимают значения по умолчанию, должны быть расположены
- •void mystrcat(char *s1, char *s2, int len);
- •// Применение пользовательской версии функции strcat()
- •// Пользовательская версия функции strcat().
- •Перегрузка функций и неоднозначность
- •Неоднозначность в программе вызвана не перегрузкой функции myfunc(), объявленной дважды для приема double-
- •Неоднозначность может быть также вызвана использованием в перегруженных функциях аргументов, передаваемых по умолчанию.
Ограничения при использовании ссылок
На применение ссылочных переменных накладывается ряд следующих ограничений:
■Нельзя ссылаться на ссылочную переменную.
■Нельзя создавать массивы ссылок.
■Нельзя создавать указатель на ссылку, т.е. нельзя к ссылке
Перегрузка функций
Перегрузка функций — это
механизм, который позволяет двум родственным функциям иметь
одинаковые имена.
В C++ несколько функций могут иметь одинаковые имена, но при условии, что их параметры будут различными. Такую ситуацию называют перегрузкой функций
(function overloading), а функции,
// "Трехкратная" перегрузка функции f(). #include <iostream>
using namespace std;
void f(int i); // |
один целочисленный параметр |
||
void |
f(int i, |
int |
j); // два целочисленных параметра |
void |
f(double |
k); |
// один параметр типа double |
int main()
{
f (10); // вызов функции f(int)
f(10, 20); // вызов функции f (int, int)
f(12.23); // вызов функции f(double)
return 0;
}
void f(int i)
{
cout << "В функции f(int), i равно " << i ;
}
void f(int i, int j)
{
cout << "В функции f(int, int), i равно " << i;
cout << ", j равно " << j << '\n';
}
void f(double k)
{
cout << "В функции f(double), k равно " << k ;
}
При выполнении эта программа генерирует следующие результаты.
Вфункции f(int), i равно 10
Вфункции f(int, int), i равно 10, j равно 20
Вфункции f(double), к равно 12.23
Чтобы лучше понять выигрыш от перегрузки функций, рассмотрим три функции из стандартной библиотеки: abs(), labs() и fabs().
-функция abs() возвращает модуль целого числа,
-функция labs() возвращает модуль длинного целочисленного значения (типа long),
-функция fabs() возвращает модуль значения с плавающей
// Создание функций myabs() — перегруженной версии функции abs().
#include <iostream> using namespace std;
// Функция myabs() перегружается тремя способами.
int myabs(int i); double myabs(double d); long myabs(long l);
int main()
{
cout << myabs(-10) << "\n";
cout << myabs(-11.0) << "\n";
cout << myabs(-9L) << "\n";
return 0;
}
int myabs(int i)
{
cout << "Использование int-функции myabs(): ";
if(i<0) return -i;
else return i;
}
double myabs(double d)
{
cout << "Использование double-функции myabs(): ";
if(d<0.0) return -d;
else return d;
}
long myabs(long l)
{
cout << "Использование long-функции myabs(): ";
if(1<0) return -1;
else return 1;
}
Результаты выполнения этой программы таковы.
Использование int-функции myabs(): 10
Использование double-функции myabs(): 11
Использование long-функции myabs(): 9
Принципиальная значимость перегрузки состоит в том, что она позволяет обращаться к связанным функциям посредством одного, общего для всех, имени. Следовательно, имя myabs представляет общее действие, которое выполняется во всех случаях.
