Функции с параметрами
Для нормальной работы функции нужны исходные данные, и получить их она должна, согласно принципам структурного программирования, исключительно из своих параметров.
Обобщенно определение функции с параметрами выглядит так:
[спецификатор класса памяти] [спецификатор типа]
имя функции([список формальных параметров]
где [список-формальных-параметров] — это перечисленные через запятую формальные параметры с указанием их типа.
Параметр функции — это принятый функцией аргумент, значение, переданное из вызывающего кода.
- фактический параметр — аргумент, передаваемый в функцию при ее вызове;
- формальный параметр — аргумент, указываемый при объявлении или определении функции.
Пример функции с одним параметром
// Объявление функции. int a — формальный параметр, имя параметра может отсутствовать.
int myfunction(int a);
// Определение функции. int b — формальный параметр, имя параметра может не совпадать с указанным при объявлении функции.
int myfunction(int b)
return 0;
>
int main()
int c=0;
myfunction(c); // Вызов функции. c — фактический параметр.
return 0;
>
Передача параметра по значению
Параметры в Си передаются по значению, то есть вызывающая функция копирует в память, доступную вызываемой функции (сегмент стека), непосредственное фактическое значение.
Изменение копии переменной, соответственно, оригинал не затрагивает!
Передача параметра по адресу
Если необходимо именно изменить переменную из внешней, по отношению к вызываемой функции, области видимости, можно копировать адрес переменной, подлежащей изменению. Соответственно при вызове функции g(&x) приходится использовать операцию взятия адреса.
Можно заметить, что передача параметра по адресу является частным случаем передачи по значению: передаваемым значением является адрес, по которому можно найти другое значение — значение переменной x.
Параметры функций JavaScript
Ранее в этом учебнике вы узнали, что у функций могут быть параметры:
function имяФункции(параметр1, параметр2, параметр3) выполняемый код
>
Параметры функции это имена, перечисленные в определении функции. Аргументы функции это реальные значения, переданные (и полученные) в функцию.
При этом функции JavaScript не выполняют никакой проверки значений параметров (аргументов).
Правила параметров
- Определение функции JavaScript не задает тип данных для параметров.
- Функции JavaScript не проводят проверку типов переданных аргументов.
- Функции JavaScript не проверяют количество полученных аргументов.
Параметры по умолчанию
Если функция вызывается с пропущенными аргументами (меньшим количеством параметров, чем декларировано в определении), то не заданные параметры устанавливаются в значение undefined.
Иногда это приемлемо, но иногда лучше присваивать параметру значение по умолчанию:
function myFunction(x, y) < if (y === undefined) < y = 0; >>
В ECMAScript 2015 допускает использование параметров по умолчанию в заголовке функции:
function (a=1, b=1) < // код функции >
Если функция вызывается с лишними аргументами (большим количеством параметров, чем декларировано в определении), то доступ к этим аргументам можно получить через специальный объект arguments.
Объект Arguments
У всех функций JavaScript есть встроенный объект arguments, который называется объект аргументов.
Объект аргументов содержит массив всех аргументов, переданных в функцию при ее вызове.
Благодаря этому объекту, можно легко, например, найти максимальное значение в переданном в функцию списке чисел:
x = findMax(1, 123, 500, 115, 44, 88); function findMax() < var i; var max = -Infinity; for (i = 0; i < arguments.length; i++) < if (arguments[i] >max) < max = arguments[i]; >> return max; >
Или создать функцию для суммирования всех переданных значений:
x = sumAll(1, 123, 500, 115, 44, 88); function sumAll() < var i; var sum = 0; for (i = 0; i < arguments.length; i++) < sum += arguments[i]; >return sum; >
Аргументы передаются по значению
Параметры в вызове функции — это аргументы функции.
Аргументы передаются по значению. Т.е. функция знает только значение аргумента, но не его расположение.
Если функция изменит значение аргумента, то это не изменит оригинальное значение параметра.
Изменение аргумента не заметно (не отражается) за пределами функции.
Объекты передаются по ссылке
В JavaScript ссылки на объект являются значениями.
Из-за этого, объекты ведут себя так, как будто они передаются по ссылке. Т. е. если функция изменит какое-нибудь свойство объекта, то она изменит и его оригинальное значение.
Изменение свойства объекта заметно (отражается) за пределами функции.
Что такое параметр функции
Через параметры в функцию можно передать различные значения. Параметры перечисляются после имени функции через запятую в скобках:
(тип_параметра1 имя_параметра1, тип_параметра2 имя_параметра2, . тип_параметраN имя_параметраN)
Для каждого параметра указывается его тип и имя.
Например, определим и вызовем функцию, которая выводит на консоль имя и возраст человека:
#include void print(std::string name, unsigned age) < std::cout int main() < print("Tom", 38); // Name: Tom Age: 38 >
При запуске программы мы получим следующий консольный вывод:
Name: Tom Age: 38
Функция print() принимает два параметра и выводит на консоль их значения. Первый параметр называется name и представляет тип std::string . А второй параметр называется age и представляет тип unsigned int . И при вызове функции для этих параметров необходимо передать значения
print("Tom", 38);
Значения, передаваемые параметрам функции при ее вызове, называются аргументами. В данном случае в качестве аргументов передаются строковый и целочисленный литералы. При этом аргументы передаются по позиции, то есть первый аргумент (строка «Tom») передается первому параметру (параметру name), второй аргумент (число 38) — второму параметру (параметру age) и так далее.
При этом аргументы должны соответствовать параметрам по типу или допускать неявно преобразование в тип параметра. Так, в примере выше параметру name передается строковый литерал, который автоматически преобразуется в тип std::string .
Подобным образом можно передавать в параметрам не только литералы, но и, например, значения переменных и констант:
#include void print(std::string name, unsigned age) < std::cout int main() < const std::string userName ; unsigned userAge ; print(userName, userAge); // Name: Bob Age: 42 >
При вызове функции здесь параметр name получит значение константы userName, а параметр age — значение переменной userAge.
При использовании прототипа функции прототип после имени функции в скобках должен содержать типы параметров:
#include void print(std::string, unsigned); // прототип функции print int main() < print("Sam", 28); // Name: Sam Age: 28 >void print(std::string name, unsigned age)
Опционально в прототипе можно указывать имена параметров:
void print(std::string name, unsigned age); // прототип
Аргументы по умолчанию
Функция может принимать аргументы по умолчанию, то есть некоторые значения, которые функция использует, если при вызове для параметров явным образом не передается значение:
#include void print(std::string name, unsigned age = 18) < std::cout int main() < print("Sam"); // Name: Sam Age: 18 print("Tom", 22); // Name: Tom Age: 22 >
Для установки значения по умолчанию параметру присваивается это значение unsigned age = 18 . И если для второго параметра не будет передано значение, то он будет использовать значение по умолчанию. Консольный вывод программы:
Name: Sam Age: 18 Name: Tom Age: 22
При объявлении прототипа подобной функции он тоже может содержать значение по умолчанию для параметра. И в этом случае мы можем не определять в функции значение по умолчанию для параметра — оно будет браться из прототипа:
#include void print(std::string, unsigned = 18); // прототип int main() < print("Sam"); // Name: Sam Age: 18 print("Tom", 23); // Name: Tom Age: 23 >void print(std::string name, unsigned age)
При определении необязательных параметров стоит учитывать, что они должны идти после обязательных. Например, назначим параметру name тоже значение по умолчанию:
#include void print(std::string = «Undefined», unsigned = 18); // прототип int main() < print(); // Name: Undefined Age: 18 print("Sam"); // Name: Sam Age: 18 print("Tom", 23); // Name: Tom Age: 23 >void print(std::string name, unsigned age)
Поскольку здесь параметр name определен как необязательный, то следующий за ним параметр age тоже должен иметь значение по умолчанию.
Автоматическое выведение типа параметров
Стоит отметить, что начиная со стандарта C++20 можно вместо конкретного типа для параметров указывать ключевое слово auto . Тогда тип параметров будет выводиться автоматически на этапе компиляции на основе передаваемых в функцию аргументов:
#include void sum(auto, auto); // прототип функции sum int main() < const int n1; const int n2; sum(n1, n2); // 3 + 4 = 7 const double d1; const double d2; sum(d1, d2);; // 3.3 + 4.4 = 7.7 > void sum(auto a, auto b)
- Глава 1. Введение в С++
- Язык программирования С++
- Первая программа на Windows. Компилятор g++
- Первая программа на Windows. Компилятор Clang
- Первая программа на Linux. Компилятор g++
- Первая программа на MacOS. Компилятор Clang
- Настройка параметров компиляции
- Локализация и кириллица в консоли
- Структура программы
- Переменные
- Типы данных
- Константы
- Ввод и вывод в консоли
- using. Подключение пространств имен и определение псевдонимов
- Арифметические операции
- Статическая типизация и преобразования типов
- Поразрядные операции
- Операции присваивания
- Условные выражения
- Конструкция if-else и тернарный оператор
- Конструкция switch-case
- Циклы
- Ссылки
- Массивы
- Многомерные массивы
- Массивы символов
- Введение в строки
- Что такое указатели
- Операции с указателями
- Арифметика указателей
- Константы и указатели
- Указатели и массивы
- Определение и объявление функций
- Область видимости объектов
- Параметры функции
- Передача аргументов по значению и по ссылке
- Константные параметры
- Оператор return и возвращение результата
- Указатели в параметрах функции
- Массивы в параметрах функции
- Параметры функции main
- Возвращение указателей и ссылок
- Перегрузка функций
- Рекурсивные функции
- Рекурсия на примере быстрой сортировки
- Указатели на функции
- Указатели на функции как параметры
- Тип функции
- Указатель на функцию как возвращаемое значение
- Разделение программы на файлы
- Внешние объекты
- Динамические объекты
- Динамические массивы
- unique_ptr
- shared_ptr
- Определение классов
- Конструкторы и инициализация объектов
- Управление доступом. Инкапсуляция
- Объявление и определение функций класса
- Конструктор копирования
- Константные объекты и функции
- Ключевое слово this
- Дружественные функции и классы
- Статические члены класса
- Деструктор
- Структуры
- Перечисления
- Наследование
- Управление доступом в базовых и производных классах
- Скрытие функционала базового класса
- Множественное наследование
- Виртуальные функции и их переопределение
- Преобразование типов
- Динамическое преобразование
- Особенности динамического связывания
- Чистые виртуальные функции и абстрактные классы
- Перегрузка операторов
- Операторы преобразования типов
- Оператор индексирования
- Переопределение оператора присваивания
- Пространства имен
- Вложенные классы
- Обработка исключений
- Вложенные try-catch
- Создание своих типов исключений
- Тип exception
- Типы исключений
- Шаблоны функций
- Шаблон класса
- Специализация шаблона класса
- Наследование и шаблоны классов
- Типы контейнеров
- Вектор
- Итераторы
- Операции с векторами
- Array
- List
- Forward_list
- Deque
- Стек std::stack
- Очередь std::queue
- Очередь приоритетов std::priority_queue
- Множества
- Словарь std::map
- Span
- Определение строк
- Строки с поддержкой Unicode
- Преобразование типов и строки
- Сравнение строк
- Получение подстроки и проверка начала и конца строки
- Поиск подстроки
- Изменение строки
- Операции с символами
- Программа подсчета слов
- Тип std:string_view
- rvalue
- Конструктор перемещения
- Оператор присваивания с перемещением
- Роль noexcept при перемещении
- Объекты функций
- Лямбда-выражения
- Захват внешних значений в лямбда-выражениях
- Шаблон std::function<>
- Минимальный и максимальный элементы
- Поиск элементов
- Копирование элементов
- Удаление элементов и идиома Remove-Erase Idiom
- Сортировка
- Представления. Фильтрация
- Проекция данных
- Пропуск элементов. drop_view и drop_while_view
- Извлечение диапазона элементов. take_view и take_while_view
- Цепочки представлений
- Оператор requires
- Концепты
- Выражение requires
- Ограничения типа для auto
- Базовые типы для работы с потоками
- Файловые потоки. Открытие и закрытие
- Чтение и запись текстовых файлов
- Переопределение операторов ввода и вывода
- Математические константы и операции
- Форматирование строк и функция format
- std::optional
- Управление ресурсами. Идиома RAII
- Идиома копирования и замены
- Идиома Move-and-Swap
- Первая программа в Visual Studio
- Первая программа в Qt Creator
Параметры функций — Основы JavaScript
Функции могут не только возвращать значения, но и принимать их в виде параметров (их еще называют аргументами). С параметрами функций мы уже сталкивались много раз:
// Принимает на вход параметр любого типа console.log('я параметр'); // Принимает на вход два строковых параметра // первый – что ищем, второй – на что меняем 'google'.replace('go', 'mo'); // moogle; // Принимает на вход два числовых параметра // первый – начальный индекс (включая), второй – конечный индекс (не включая) 'hexlet'.slice(1, 3); // ex
В этом уроке мы научимся создавать функции, которые принимают на вход параметры. Представим, что перед нами стоит задача – реализовать функцию getLastChar() . Она возвращает последний символ в строке, переданной на вход как параметр. Вот как будет выглядеть использование этой функции:
// Передача параметров напрямую без переменных getLastChar('Hexlet'); // t // Передача параметров через переменные const name1 = 'Hexlet'; getLastChar(name1); // t const name2 = 'Goo'; getLastChar(name2); // o
Из описания и примеров кода мы можем сделать следующие выводы:
- Нам нужно определить функцию getLastChar()
- Функция должна принимать на вход один параметр строкового типа
- Функция должна возвращать значение строкового типа
const getLastChar = (text) => // Вычисляем индекс последнего символа как длина строки - 1 return text[text.length - 1]; >;
Разберем его. В скобках указывается имя переменной text , которая служит нам параметром. Имя параметра может быть любым. Главное, чтобы оно отражало смысл того значения, которое содержится внутри. Мы могли бы определить функцию и вот так:
const getLastChar = (str) => return str[str.length - 1]; >;
Конкретное значение параметра будет зависеть от вызова этой функции.
// Внутри функции str будет равна 'hexlet' getLastChar('hexlet'); // t // Внутри функции str будет равна 'code' getLastChar('code'); // e // Внутри функции str будет равна 'Winter is coming' // Имя переменной снаружи не связано с именем переменной в определении функции const text = 'Winter is coming'; getLastChar(text); // g
Точно таким же образом можно указывать два, три и более параметров. Каждый параметр отделяется от другого запятой:
// функция по нахождению среднего числа const average = (a, b) => return (a + b) / 2; >; average(1, 5); // 3 average(1, 2); // 1.5
Тоже самое относится и к методам. Они могут требовать на вход любое количество параметров, которое им нужно для работы:
// первый параметр – что ищем // второй параметр – на что меняем 'google'.replace('go', 'mo'); // moogle
Чтобы создать такие функции и методы, нужно в определении указать необходимое количество параметров через запятую, дав им понятные имена. Ниже пример определения функции replace() , которая заменяет в слове одну часть строки на другую:
const replace = (text, from, to) => // здесь тело функции, но мы его // опускаем, чтобы не отвлекаться >; replace('google', 'go', 'mo'); // moogle
Когда параметров два и более, то практически для всех функций становится важен порядок передачи этих параметров. Если его поменять, то функция отработает по-другому:
// ничего не заменилось, // так как внутри google нет mo replace('google', 'mo', 'go'); // google
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Об обучении на Хекслете
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Урок «Как эффективно учиться на Хекслете»
- Вебинар « Как самостоятельно учиться »
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях: