15.3. Ensuring That a Function Doesn’t Modify an Argument
Problem
You are writing a function, and you need to guarantee that its arguments will not be modified when it is invoked.
Solution
Declare your arguments with the keyword const to
prevent your function from changing the arguments. See Example 15-3 for a short sample.
Example 15-3. Guaranteeing unmodified arguments
#include <iostream>
#include <string>
void concat(const std::string& s1, // These are declared const, so they
const std::string& s2, // cannot be changed
std::string& out) {
out = s1 + s2;
}
int main() {
std::string s1 = "Cabo ";
std::string s2 = "Wabo";
std::string s3;
concat(s1, s2, s3);
std::cout << "s1 = " << s1 << '\n';
std::cout << "s2 = " << s2 << '\n';
std::cout << "s3 = " << s3 << '\n';
}Discussion
Example 15-3 demonstrates a
straightforward use of const. There are a couple of
good reasons for declaring your function parameters const when you don’t plan on changing them. First, you communicate your
intent to human readers of your code. By declaring a parameter as const, what you are saying, essentially, is that the const parameters are for input. This lets consumers of
your function, code with the assumption that the values will not change. Second, it tells
the compiler to disallow any modifying operations, in the event you do so by accident.
Consider an unsafe version of concat from Example 15-3:
void concatUnsafe(std::string& s1, std::string& s2, std::string& out) { out = s1 += s2; // Whoops, wrote to s1 } ...