As stated in book Effective C++: "Use const whenever possible.", one would assume that this definition: Vec3f operator+(Vec3f &other);
would be better defined as Vec3f operator+(const Vec3f &other) const;
or even better as const Vec3f operator+(const Vec3f &other) const;
.
Or an example with 5 const keywords: const int*const Foo(const int*const&)const;
Of course, you should only include const where there can be one. What Im asking is it a good practice to use them whenever possible? While it does give you more error safe code, it can get quite messy. Or should you, for example, ignore pointer and reference const (unless you really need it), and use it only on the types itself, as in const int* Foo(const int* parameter)const;
, so it doesnt end up too messy?
Additional info: http://duramecho.com/ComputerInformation/WhyHowCppConst.html
Thanks in advance!
Yes, you should use const whenever possible. It makes a contract that your code will not change something. Remember, a non-const variable can be passed in to a function that accepts a const parameter. You can always add const, but not take it away (not without a const cast which is a really bad idea).
The qualifier const can be applied to the declaration of any variable to specify that its value will not be changed ( Which depends upon where const variables are stored, we may change the value of const variable by using pointer ).
You should rather use const for ensuring const-correctness and not for micro-optimization.
No, const does not help the compiler make faster code.
Using const
whereever possible is generally a good thing, but it's a bad wording. You should be using const
whereever it is possible and makes sense.
Above all else (it may, rarely, open extra optimization opportunities) it is a means to document your intention of not modifying something.
In the concrete example of a member operator+
that you have given, the best solution would not be to make everything const
, but a freestanding operator+
which bases on member operator+=
and takes one argument by value like so:
T operator+(T one, T const& two) const { return one += two; }
This solution works with T
appearing on either side of the plus sign, it allows for chaining, it doesn't replicate code, and it allows the compiler to perform the maximum of optimizations.
The semantics of operator+
require that a copy be made, so you can as well have the compiler make it (the other one will be optimized out).
It would be possible to make one
a const&
, but then you would have to manually make a copy, which would likely be sub-optimal (and much less intellegible).
C++ FAQ:
If you find ordinary type safety helps you get systems correct (it does; especially in large systems), you'll find const correctness helps also.
You should use const
when you want to be sure not to change variable accidentally or intentionally. Some constants (globals and class static, strings & integers, but not variables with nontrivial constructor) can be placed in read-only parts of the executable, therefore result in segmentation fault if you try to write to it.
You should be explicit using const
as a specifier on functions that follow this principle as well as on function arguments. If you don't have to change actual argument, make it const
. This doesn't limit the possible usages of such function, but extends them, because now they might be used on const
arguments, and on const
objects.
In declaration
const int* foo(const int* const&) const;
every const
means something different and yes, obviously it should be used if it is needed.
Using const
increases type-safety of your program.
C++ FAQ:
[18.3] Should I try to get things const correct "sooner" or "later"?
At the very, very, very beginning.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With