Java#39;s final vs. C++#39;s const(Java 的 final 与 C++ 的 const)
问题描述
The Java for C++ programmers tutorial says that (highlight is my own):
The keyword final is roughly equivalent to const in C++
What does "roughly" mean in this context? Aren't they exactly the same?
What are the differences, if any?
In C++ marking a member function const
means it may be called on const
instances. Java does not have an equivalent to this. E.g.:
Values can be assigned, once, later in Java only e.g.:
is legal in Java, but not C++ whereas:
In both Java and C++ member variables may be final
/const
respectively. These need to be given a value by the time an instance of the class is finished being constructed.
In Java they must be set before the constructor has finished, this can be achieved in one of two ways:
In C++ you will need to use initialisation lists to give const
members a value:
In Java final can be used to mark things as non-overridable. C++ (pre-C++11) does not do this. E.g.:
But in C++:
this is fine, because the semantics of marking a member function const
are different. (You could also overload by only having the const
on one of the member functions. (Note also that C++11 allows member functions to be marked final, see the C++11 update section)
C++11 update:
C++11 does in fact allow you to mark both classes and member functions as final
, with identical semantics to the same feature in Java, for example in Java:
Can now be exactly written in C++11 as:
I had to compile this example with a pre-release of G++ 4.7. Note that this does not replace const
in this case, but rather augments it, providing the Java-like behaviour that wasn't seen with the closest equivalent C++ keyword. So if you wanted a member function to be both final
and const
you would do:
(The order of const
and final
here is required).
Previously there wasn't a direct equivalent of const
member functions although making functions non-virtual
would be a potential option albeit without causing an error at compile time.
Likewise the Java:
becomes in C++11:
(Previously private
constructors was probably the closest you could get to this in C++)
Interestingly, in order to maintain backwards compatibility with pre-C++11 code final
isn't a keyword in the usual way. (Take the trivial, legal C++98 example struct final;
to see why making it a keyword would break code)
这篇关于Java 的 final 与 C++ 的 const的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!