Обычно функции и классы объявляются в заголовочных файлах и определяются в некоторых исходных файлах. Например, у меня есть эта функция, которая просто принимает постоянную ссылку на int и возвращает значение bool, определяющее, является ли параметр четным или нечетным:
Так что в моем заголовке odd_even.h
я написал:
bool is_even(const int& x); // I used const ref. to avoid copy and unintentional modification of the argument.
И в источнике odd_even.cpp
:
bool is_even(int& x) {
if (x = 1024) // some unintentional assinemnt (==) though modern compilers detect it.
; //some statement here
//x = 1024; // or here another unintentional modification
return !(x % 2) ? true : false;
}
И программа драйвера:
int main(){
int a{ 17 };
std::cout << (a) << std::endl;
std::cout << std::boolalpha << is_even(a) << endl;
std::cout << (a) << std::endl;
std::cout << std::endl;
}
Как вы можете видеть, функция is_even
Definition непреднамеренно изменяет аргумент, и клиент моей программы не осознает, что эта функция будет изменять аргумент до тех пор, пока его объявление принимает константную ссылку на int.
Так есть ли обход этой ошибки, которая предотвращает такую ошибку?