Константные параметры

Последнее обновление: 03.03.2023

Параметры могут быть константными - значения таких параметров не могут меняться. Константые параметры предваряются ключевым словом const. Например:

#include <iostream>
 
void square(int);
 
int main()
{
    int number {4};
    square(number);   // n * n = 16
}
void square(const int n)
{
    //n = n * n;     так нельзя сделать
    std::cout << "n * n = " << n * n << std::endl;  
}

Здесь в функции square параметр n определен как константный. Внутри функции square мы не можем изменить его значение. Фактически он аналогичен константе.

Стоит отметить что ключевое слово const для константного параметра используется при определении функции

void square(const int n) { ...

При объявлении функции - в ее прототипе для параметров, которые передаются по значению, указывать const необязательно

// можно так
void square(int);
// можно и так
void square(const int);

Для параметров, которые передаются по ссылке, указывать const в прототипе обязательно.

Зачем нужны такие константные параметры? Иногда нужно гарантировать, что параметр от начала и до конца функции будет иметь одно и то же начальное значение. Если параметр неконстантный, то есть вероятность, что значение параметра будет случайным образом изменено внутри функции. И даже есть такая рекомендация, что если не планируется явным образом менять значение параметра, то лучше сразу определитть его как константный.

Константному параметру можно передать в качестве аргумента как константу, так и переменную.

От этой ситуации следует отличать передачу констант в качестве аргументов для неконстантных параметров:

#include <iostream>

void square(int, int);

int main()
{
	const int a = 4;
	const int b = 5;
	square(a, b);	// 400
	return 0;
}
void square(int a, int b)
{
	a = a * a;
	b = b * b;
	std::cout << "In square: a * b = " << a * b << std::endl;
}

Несмотря на то, что при вызове функции ей передаются константы, но так как сами параметры не являются константными, то функция может изменять их значения.

Константные ссылки

Параметры, которые передаются по ссылке, также могут быть константными:

#include <iostream>
 
void square(const int&);	// функция получает константную ссылку
 
int main()
{
    int number = 5;
    square(number);  // n * n = 25
}
void square(const int &n)
{
    // n = n * n;     так нельзя сделать
    std::cout << "n * n = " << n * n << std::endl;
}

Значение константной ссылки также нельзя менять.

Если функция получает аргументы по ссылке, то чтобы передать в функцию константу, параметры тоже должны представлять ссылку на константу (неконстантной ссылке мы не можем передать константу.):

#include <iostream>
 
void square(const int&);
 
int main()
{
    const int number {6};
    square(number);  // n * n = 36
}
void square(const int &n)
{
    std::cout << "n * n = " << n * n << std::endl;
}

И если в функцию необходимо передать большие объекты, которые не должны изменяться, то определение параметров именно как константных ссылок больше всего подходит для данной задачи.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850