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


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

1
2
3
4
5
void square(const int n)
{
// n = n * n; // можно считать значение параметра, но не изменять его
std::cout << n * n << std::endl;
}
То же самое касается и передачи параметра по ссылке:

1
2
3
4
5
void square(const int &n)
{
// n = n * n; // можно считать значение параметра, но не изменять его
std::cout << n << std::endl;
}
Константному параметру можно передать в качестве аргумента как константу, так и переменную:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

void square(const int, const int);

int main()
{
const int a = 4;
int b = 5;
square(a, b); // 20
return 0;
}
void square(const int a, const int b)
{
//a = a * a; так нельзя сделать
//b = b * b; так нельзя сделать
std::cout << "In square: a * b = " << a * b << std::endl;
}
От этой ситуации следует отличать передачу констант в качестве аргументов для неконстантных параметров:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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;
}
Несмотря на то, что при вызове функции ей передаются константы, но так как сами параметры не являются константными, то функция может изменять их значения.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

void square(const int&, const int&);

int main()
{
const int a = 4;
const int b = 5;
square(a, b); // 20
return 0;
}
void square(const int &a, const int &b)
{
// a = a * a; так нельзя сделать
// b = b * b; так нельзя сделать
std::cout << "In square: a * b = " << a * b << std::endl;
}
И если в функцию необходимо передать большие объекты, которые не должны изменяться, то определение параметров именно как константных ссылок больше всего подходит для данной задачи.