Мы уже говорили о параметрах функции в отдельной статье. В этой – мы коротко разберемся, что такое параметры функции по умолчанию. Понять это несложно. Используют их в программировании в основном для удобства. Например нам надо нарисовать 5 одинаковых прямоугольников. Для этого мы можем написать функцию, которая принимает параметры по умолчанию. Рисует она, допустим, прямоугольник 10 на 10 символов. И этот символ всегда ‘@’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> using namespace std; // функция рисует прямоугольник void drawRectangle(int countSymb1 = 10, int countSymb2 = 10, char symb = '@') { for (int i = 0; i < countSymb1; i++) { for (int j = 0; j < countSymb2; j++) { cout << symb; } cout << endl; } cout << endl << endl; } int main() { setlocale(LC_ALL, "rus"); cout << "Пять прямоугольников:\n\n"; drawRectangle(); // не передаем в функцию никаких параметров drawRectangle(); drawRectangle(); drawRectangle(); drawRectangle(); return 0; } |
Хотя мы не передавали в функции никаких параметров при вызове, мы увидим пять одинаковых прямоугольников из символов ‘@’ на нашем экране. Функция использовала те значения, которые были присвоены параметрам по умолчанию при её определении.
Но это не всё. Даже если мы определили параметры по умолчанию – есть удобная возможность изменить их значения при вызове.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> using namespace std; // функция рисует прямоугольник void drawRectangle(int countSymb1 = 10, int countSymb2 = 10, char symb = '@') { for (int i = 0; i < countSymb1; i++) { for (int j = 0; j < countSymb2; j++) { cout << symb; } cout << endl; } cout << endl << endl; } int main() { setlocale(LC_ALL, "rus"); cout << "Используем параметры по умолчанию.\n\n"; drawRectangle(); // не передаем в функцию никаких параметров cout << "Задаём другое количество символов в ширину, а количество\n" << "символов в высоту и сам символ оставим по умолчанию.\n\n"; drawRectangle(5); cout << "Меняем только символ.\n\n"; //drawRectangle(' |
Допустим, надо нарисовать прямоугольник 5 символов в ширину. Остальные параметры (10 символов в высоту и сам символ ‘@’ ) нас устраивают. Тогда в функцию мы передаем только один параметр. Оставшиеся параметры функция возьмет из заданных по умолчанию.
Если же нам необходимо изменить только символ и в параметрах он указан последним, то придется прописать предшествующие параметры, даже если их значения нас устраивают.
На экране увидим:
Еще один момент, который касается определения параметров по умолчанию в заголовке функции. Определяться они должны справа налево. Например если из трех параметров необходимо задать только один по умолчанию, то он должен быть определен крайним справа.
На картинке параметр по умолчанию последний : char symb = ‘@’. Если их надо определить два – то точно так же это будут два крайних справа:
1 | void drawRectangle(int countSymb1,int countSymb2 = 10,char symb = '@') |
Если вы объявляете прототип функции – надо определить параметры по умолчанию именно в прототипе. В самом определении функции этого делать уже не надо. Пожалуй всё. Если что-то не понятно – спрашивайте в комментариях.
Параметры по умолчанию обычно вот так просто не применяются… Они нужны если есть какие-то типичные параметры. Ну например…
Вы пишите читалку книг и по умолчанию масштаб 100%. Возможно у вас будет функция типа
load(string filename, /* всякие другие параметры */, scale = 100);
Т.е. понятно, что имя файла – обязательный параметр, а масштаб может и не указываться.
Пишите вы текстовый редактор. Кодировка по умолчанию UTF-8 (например).
Пишите штуку, которая сохраняет что-нибудь в XML формате (есть такой популярный формат) и по умолчанию используется XML версии 1.0.
Я параметры по умолчанию в своих функциях почти не использую. Сейчас поискал их в последнем своем проекте. Нашел только один пример:
void animation(QString texturename, bool randomStartFrame = false);
Тут функция запускает анимацию, в первом аргументе передается имя файла с анимацией. Если второй аргумент не указан, то по умолчанию анимация будет запущена начиная с первого кадра. Если же второй аргумент true – то анимация будет запущена со случайного кадра.
Как по мне, вот в этом случае с анимацией параметры по умолчанию тоже использовать не стоило бы… В любом случае для их оправданного использования нужно “нормальное поведения”, от которого можно отклониться заданием параметров.
в онлайн компиляторе не получается – выдает ошибку на заданный пример