I'll use the following (trivial) interface as an example:
struct IObject
{
virtual ~IObject() {}
virtual std::string GetName() const = 0;
virtual void ChangeState() = 0;
};
Logic dictates that GetName
should be a const
member function while ChangeState
shouldn't.
All code that I've seen so far doesn't follow this logic, though. That is, GetName
in the example above wouldn't be marked as a const
member function.
Is this laziness/carelessness or is there a legitimate reason for this? What are the major cons of me forcing my clients to implement const
member functions when they are logically called for?
EDIT: Thanks for your responses everyone. I think it's pretty much unanimous: laziness/ignorance is the reason for what I'm seeing.
I think it's laziness/carelessness. GetName()
should have no effect on the object's state, and the contract of IObject
should state that fact explicitly.
If the inheriting class was somehow forced to make GetName()
have (hidden!) side effects, they could always declare the corresponding fields as mutable
.