Функции с параметрами по умолчанию c
Урок №103. Параметры по умолчанию
Обновл. 13 Сен 2021 |
На этом уроке мы рассмотрим, что такое параметры по умолчанию в языке С++ и то, как их использовать.
Параметры по умолчанию
Параметр по умолчанию (или «необязательный параметр») — это параметр функции, который имеет определенное (по умолчанию) значение. Если пользователь не передает в функцию значение для параметра, то используется значение по умолчанию. Если же пользователь передает значение, то это значение используется вместо значения по умолчанию. Например:
Результат выполнение программы:
Параметр по умолчанию — это отличный вариант, когда функция нуждается в значении, которое пользователь может переопределить, а может и не переопределить. Например, вот несколько прототипов функций, для которых могут использоваться параметры по умолчанию:
Несколько параметров по умолчанию
Функция может иметь несколько параметров по умолчанию:
При следующих вызовах функции:
Values: 3 4 5
Values: 3 4 12
Values: 3 11 12
Values: 10 11 12
Правило №1: Все параметры по умолчанию в прототипе или в определении функции должны находиться справа. Следующее вызовет ошибку:
Правило №2: Если имеется более одного параметра по умолчанию, то самым левым параметром по умолчанию должен быть тот, который с наибольшей вероятностью (среди всех остальных параметров) будет явно переопределен пользователем.
Объявление параметров по умолчанию
Как только параметр по умолчанию объявлен, повторно объявить его уже нельзя. Это значит, что для функции с предварительным объявлением и определением, параметр по умолчанию объявить можно либо в предварительном объявлении, либо в определении функции, но не в обоих местах сразу. Например:
Функции с параметрами по умолчанию c
Как вы уже знаете, C++ позволяет вам с помощью параметров передавать информацию в функции. Из урока 13 вы выяснили, что C++ также обеспечивает перегрузку функций, предусматривая определения, содержащие разное количество параметров или даже параметры разных типов. Кроме этого, в C++ при вызове функций можно опускать параметры. В таких случаях для опущенных параметров будут использоваться значения по умолчанию. Этот урок описывает как устанавливать значения по умолчанию для параметров функций. К концу данного урока вы освоите следующие основные концепции:
• C++ позволяет программам указывать для параметров значения по умолчанию.
• Значения по умолчанию для параметров указываются в заголовке функции при ее определении.
• Если вызов функции опускает значения одного или нескольких параметров, C++ будет использовать значения по умолчанию.
• Если вызов функции опускает значение определенного параметра, то должны быть опущены и значения всех последующих параметров.
Обеспечение значений по умолчанию для параметров упрощает возможность повторного использования функций (их использования несколькими программами).
ОПРЕДЕЛЕНИЕ ЗНАЧЕНИЙ ПО УМОЛЧАНИЮ
Обеспечить значения по умолчанию для параметров функции очень легко. Вы просто присваиваете значение параметру с помощью оператора присваивания С++ прямо при объявлении функции, как показано ниже:
void some_function(int size=12, float cost=19.95) //—->Значения по умолчанию
Следующая программа DEFAULTS. CPP присваивает значения по умолчанию параметрам a, b и c внутри функции show_parameters. Затем программа четыре раза вызывает эту функцию, сначала не указывая параметров вообще, затем указывая значение только для а, потом значения для а и b и, наконец, указывая значения для всех трех параметров:
void show__parameters (int a=1, int b=2, int c=3)
<
show_parameters();
show_parameters(1001);
show_parameters(1001, 2002);
show_parameters(1001, 2002, 3003);
>
Когда вы откомпилируете и запустите эту программу, на вашем экране появится следующий вывод:
а 1001 b 2002 с 3003
Как видите, если необходимо, функция использует значения параметров по умолчанию.
Правила для пропуска значений параметров
Если программа опускает определенный параметр для функции, обеспечивающей значения по умолчанию, то следует опустить и все последующие параметры. Другими словами, вы не можете опускать средний параметр. В случае предыдущей программы, если требовалось опустить значение параметра b в show_parameters, программа также должна была опустить значение параметра с. Вы не можете указать значение для а и с, опуская значение Ь.
Задание значений по умолчанию
Когда вы определяете функцию, C++ позволяет вам указать значения по умолчанию для одного или нескольких параметров. Если программа в дальнейших вызовах этой функции опускает один или несколько параметров, то функция будет использовать для них значения по умолчанию. Чтобы присвоить параметру значение по умолчанию, просто используйте оператор присваивания внутри определения функции.
Например, следующая функция payroll указывает значения по умолчанию для параметров hours и rate:
float payroll(int employ_id, float hours = 40, float rate = 5.50)
Когда программа опускает один параметр, она должна опускать все последующие параметры.
ЧТО ВАМ НЕОБХОДИМО ЗНАТЬ
Из данного урока вы узнали, что C++ позволяет вам указывать значения по умолчанию для параметров функции. Если программа опускает один или несколько параметров, функция использует значения по умолчанию. В следующих уроках, когда ваши программы начнут использовать объектно-ориентированное программирование на C++, вы будете применять параметры по умолчанию для инициализации различных переменных класса. Как вы уже знаете, переменная позволяет вам хранить значение определенного типа ( int, float и. т. д). В уроке 16 вы освоите, как хранить несколько значений одного и того же типа внутри массива. Например, ваша программа может хранить тестовые очки для 100 студентов или стоимость 50 акций. С помощью массивов хранить и использовать такие значения очень легко. До изучения урока 16 убедитесь, что вы освоили следующие основные концепции:
BestProg
Функции. Аргументы по умолчанию в функциях
Содержание
Поиск на других ресурсах:
1. Что такое аргументы по умолчанию? Каким образом объявляются аргументы по умолчанию? Общая форма объявления функции, содержащей аргументы по умолчанию
Аргумент по умолчанию – это такой аргумент функции, который программист может не указывать при вызове функции. Аргумент по умолчанию добавляется компилятором автоматически.
Чтобы использовать аргументы по умолчанию в функции, эта функция должна быть соответствующим образом объявлена. Аргументы по умолчанию объявляются в прототипе функции.
Общая форма объявления функции, которая содержит аргументы по умолчанию
2. Примеры объявления и использования функций, которые используют аргументы по умолчанию
Листинг объявления и использования функции следующий.
3. Может ли конструктор класса содержать параметры по умолчанию?
4. Пример использования конструктора и метода класса, которые получают аргументы по умолчанию
5. Какие преимущества дает использование аргументов по умолчанию в программах на C++?
Использование аргументов по умолчанию дает следующие преимущества:
6. Сколько раз можно задавать аргументы по умолчанию при объявлении функции? Пример
Во время объявления функции, аргументы по умолчанию задаются только один раз. Здесь возможны два случая. Первый, если функция имеет прототип и реализацию. Второй случай, если функция не имеет прототипа, а имеет только реализацию.
В первом случае (с прототипом), аргумент по умолчанию задается только в прототипе функции (а не в реализации). Во втором случае, аргумент по умолчанию задается в реализации функции, поскольку нет прототипа функции.
Пример. Заданы две функции:
В приведенном ниже коде демонстрируется применение функций, которые содержат аргументы по умолчанию. Важно: аргументы по умолчанию объявляются только один раз. В функции GetAreaCircle() аргументы по умолчанию объявляются в прототипе, поскольку эта функция имеет прототип. В функции GetVolumeSphere() аргументы по умолчанию объявляются в реализации, так как функция не имеет прототипа.
Лістинг программы, созданной по шаблону Win32 Console Application следующий:
7. В каком порядке должны следовать аргументы по умолчанию по отношению к обычным аргументам?
Аргументы (параметры) по умолчанию должны следовать после объявления обычных аргументов. Если объявить аргументы по умолчанию первыми, а за ними объявить обычные аргументы, то это будет ошибка.
вызов функции с параметром по умолчанию
Я написал экзамен по программированию на C ++. Был один вопрос, где я и мой профессор не согласились. Вопрос был в том, работает ли следующая функция:
Я сказал, что это не будет работать, но мой профессор сказал, что это точно будет работать из-за параметра по умолчанию в объявлении функции. Я попробовал это с MSVC, и это не сработало. Это зависит от компилятора? Как я могу убедить своего профессора, что он не работает ни в одном компиляторе, поднять мою оценку на экзамене?
Решение
Начнем с того, что вы правы, профессор не прав. И тот факт, что он утверждает, что это должно работать (когда банально показать, что это не так) означает, что он, вероятно, не должен учить C ++. Но как его показать?
Просто попробуйте скомпилировать его как минимум двумя разными компиляторами. Если оба не скомпилируют его, то очень вероятно, что это неверный код. Это самый быстрый способ.
Если это не помогло, процитируйте стандарт C ++. Вот синтаксис для выражения вызова, как описано в [expr.post] p1 и после нетерминальных ссылок:
Я не собираюсь перечислять присваивание-выражение, но учтите, что выражение никогда не может быть ничем, должен быть хотя бы один токен. Это означает, что предложение инициализатора никогда не может быть ничем, и поэтому всегда должно быть что-то между запятыми в аргументах функции.
Другие решения
Из Стандарта (выделите мое, обратите особое внимание на слово задний):
8.3.6 Аргументы по умолчанию [dcl.fct.default]
Если предложение-инициализатор указано в объявлении параметра, это предложение-инициализатор используется в качестве аргумента по умолчанию. Аргументы по умолчанию будут использоваться в вызовах, где конечные аргументы отсутствуют.
void point(int = 3, int = 4);
объявляет функцию, которая может быть вызвана с нулем, одним или двумя аргументами типа int. Это можно вызвать любым из этих способов:
Последние два вызова эквивалентны point(1,4) а также point(3,4) соответственно.
Наслаждайтесь возвращением своих очков. 😉
Это даже не действительный C ++ синтаксис.
Значения аргументов функции по умолчанию
Язык С++ позволяет присваивать параметрам функции значения по умолчанию в том случае, когда при вызове функции не указываются параметры. Значения по умолчанию задаются синтаксически сходным образом с инициализацией переменных. Например, ниже объявляется функция f(), имеющая аргументом целую переменную, значением которой по умолчанию является величина 1:
Теперь функция f() может вызываться двумя способами, как показано ниже:
f(10); // явная передача значения
f (); // функция использует значение по умолчаниюВ первом случае аргументу i будет присвоено значение 10. Во втором случае i получит значение по умолчанию, равное 1.
Аргументы по умолчанию в языке С++ позволяют программисту писать более простой код. Для того, чтобы охватывать множество ситуаций, часто функция содержит больше параметров, чем это необходимо при ее наиболее типичном использовании. Используя аргументы по умолчанию, можно указать только аргументы, которые отличаются от значений по умолчанию в каждой конкретной ситуации.
Чтобы лучше представить себе причины использования аргументов по умолчанию, рассмотрим следующий практический пример. Он содержит следующую полезную функцию xyout():
// выводит строку в позиции X, Y
void xyout (char *str, int x = 0, int у = 0)
<
if (!x) x = wherex ();
if (!y) у = wherey();
gotoxy(x, y);
cout
#include
void xyout(char *str, int x = 0, int у = 0)
<
if (!x) x = wherex ();
if (!y) у = wherey();
gotoxy(x, y);
cout
#include
void xyout(char *str, int x = 0, int у = 0)
int main()
<
xyout(«hello», 10, 10);
xyout(» there»);
xyout(«l like С++», 40); // по-прежнему на десятой строке
xyout(«This is on line 11.\n», 1, 11);
xyout(«This follows on line 12. \n»);
xyout(«This follows on line 13.»);
return 0;
>
/* Поскольку значения по умолчанию для х и у уже определены в прототипе xyout(), то они не могут быть повторены здесь */
void xyout (char *str, int x, int y)
<
if (!x) x = wherex();
if (!y) у = wherey();
gotoxy(x, y);
cout <
sloc = rloc = 0;
who = id;
cout