- •Функции, часть 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-
- •Неоднозначность может быть также вызвана использованием в перегруженных функциях аргументов, передаваемых по умолчанию.
Благодаря полиморфизму программисту нужно помнить не три различных имени, а только одно.
Несмотря на простоту приведенного примера, он позволяет понять, насколько перегрузка способна упростить процесс программирования.
Анахронизм в виде ключевого
слова overload
На заре создания C++ перегруженные функции необходимо было явным образом объявлять таковыми с помощью ключевого слова overload. Это ключевое слово больше не требуется в C++.
Общая форма использования ключевого слова overload такова.
Аргументы, передаваемые функции по умолчанию
В C++ мы можем придать параметру некоторое значение, которое будет автоматически использовано, если при вызове функции не задается аргумент, соответствующий этому параметру. Аргументы, передаваемые функции по умолчанию, можно использовать, чтобы упростить обращение к сложным функциям, а также в качестве "сокращенной формы" перегрузки
void myfunc(double num = 0.0, char ch = 'Х’)
{
…
}
После такого объявления функцию myfunc() можно
вызвать одним из трех следующих способов.
myfunc(198.234, 'A'); // Передаем явно заданные значения.
myfunc(10.1); // Передаем для параметра num значение 10.1, а для параметра ch позволяем применить аргумент, задаваемый по умолчанию ('Х').
myfunc(); // Для обоих параметров num и ch
позволяем применить аргументы, задаваемые по умолчанию.
Чтобы предусмотреть максимально возможное количество ситуаций и обеспечить их корректную обработку, функции часто объявляются с большим числом параметров, чем необходимо в наиболее распространенных случаях. Поэтому благодаря применению аргументов по умолчанию программисту нужно указывать не все аргументы (используемые в
Аргумент, передаваемый функции по умолчанию, представляет собой
значение, которое будет
автоматически передано параметру функции в случае, если аргумент, соответствующий этому параметру, явным образом не задан.
#include <iostream> using namespace std; void clrscr(int size=25); int main()
{
int i;
for(i=0; i<30; i++ ) cout << i << '\n';
clrscr(); // Очищаем 25 строк.
for(i=0; i<30; i++ ) cout << i << '\n';
clrscr(10); // Очищаем 10 строк.
return 0;
}
void clrscr(int size)
{
for(; size; size--) cout << '\n';
}
При создании функций, имеющих значения аргументов, передаваемых по умолчанию, необходимо помнить, что значения по умолчанию должны быть заданы только однажды, причем при первом объявлении функции в файле.
Важно понимать, что все параметры, которые принимают значения по умолчанию, должны быть расположены справа от остальных.
Например, следующий прототип функции содержит ошибку.
void f(int а = 1, int b);
Следующее объявление также неверно и не будет скомпилировано.
int myfunc(float f, char *str, int i=10, int j);
void mystrcat(char *s1, char *s2, int len);
void mystrcat(char *s1, char *s2);
Первая версия должна скопировать len символов из строки s2 в конец строки s1. Вторая версия копирует всю строку, адресуемую указателем s2, в конец строки, адресуемой указателем s1, т.е. действует подобно стандартной функции
strcat().