Edit: From @Jeremy Friesner's answer, he provides another view point that Why use a const member function & semantics of a const member function don't cover. It can improve clarity and disambiguous your code. People can have a brief idea of what this function is supposed to do or not do at the first glance. Very useful especially in working with others.
I come across the constant function lately.
It says:
Constant functions are those have denied permission when attempting to change the member variables of their classes.
My questions are
In a programmer perspective, if you don't want a function being able to change member variables, why not just moving the parts responsible for changing variables outside of the function at the first place? (e.g using another function)
What/when are some practical moments of having the neediness to use a constant function?
Appreciate any answers
class Foo
{
public:
int x = 0;
int Bar(int arg) const
{
x++; // fails
return x; // okay
}
};
The purpose of const
-tagged methods isn't to prevent the programmer from intentionally modifying member variables, but rather to allow the compiler to assist the programmer by producing a compile-time error when the programmer accidentally modifies a member-variable. This is useful because it's much easier and quicker to correct a compile-time error than to chase down a run-time misbehavior through manual testing.
The const
tag also assists later programmers who are reading the class's header file by helping them quickly understand what a method does or does not do. For example, if you see this in a class declaration:
class MyClass
{
[...]
int CalculateTheValue();
... you might ask yourself, "does calling CalculateTheValue()
change the state of the MyClass
object?" With a name like CalculateTheValue()
it seems like it shouldn't, but there's no way to know for sure without finding the corresponding .cpp
file and reading through the code that implements that method... which is a tedious and error-prone way to do things.
On the other hand, if you see this:
class MyClass
{
[...]
int CalculateTheValue() const;
... then you know right away that CalculateTheValue()
will not modify the MyClass
object you call it on, because it says so in the declaration. (if it did try to modify the MyClass
object, the code wouldn't compile; so if the code compiled, we know it doesn't modify it)