C++ is object oriented, in the sense that it supports the object oriented paradigm for software development.
However, differently from Java, C++ doesn't force you to group function definitions in classes: the standard C++ way for declaring a function is to just declare a function, without any class.
If instead you are talking about method declaration/definition then the standard way is to put just the declaration in an include file (normally named .h
or .hpp
) and the definition in a separate implementation file (normally named .cpp
or .cxx
). I agree this is indeed somewhat annoying and requires some duplication but it's how the language was designed (the main concept is that C++ compilation is done one unit at a time: you need the .cpp of the unit being compiled and just the .h of all the units being used by the compiled code; in other words the include file for a class must contain all the information needed to be able to generate code that uses the class). There are a LOT of details about this, with different implications about compile speed, execution speed, binary size and binary compatibility.
For quick experiments anything works... but for bigger projects the separation is something that is practically required (and it's not clear cut... it may make sense to keep SOME implementation details in the public .h).
If you're looking for a logical explanation of why this split is necessary you won't find one. Because there's none. The compiler could still use the one-compilation-unit-at-a-time model with just one file (by considering only the interface details, even if the implementation is in the same file). But this is C++, so you're forced to do the split and repeat things twice without making mistakes (otherwise it's YOUR fault if the code doesn't work: compilers are not required to detect all incompatibilities between what is in the .h
and what is in .cpp
; some are detected and some are not and just will (possibly) destroy all data on your computer if you make that kind of mistake).
The reason is mostly "because" (my own rationalization is may be keeping the compiler simpler and that back then it was considered an important "feature" being able to publish .h
files and keep implementations secret).
Note: Even if you know Java, C++ is a completely different language... and it's a language that cannot be learned just by experimenting. The reason is that it's a rather complex language with a lot of asymmetries and apparently illogical choices, and most importantly, when you make a mistake there are no "runtime error angels" to save you like in Java... but there are instead "undefined behavior daemons".
The only reasonable way to learn C++ is by reading... no matter how smart you are there is no way you can guess what the committee decided (actually being smart is sometimes even a problem because the correct answer is illogical and a consequence of historical heritage.)
Just pick a good book or two and read them cover to cover in addition to experimenting. Experimenting alone will take you nowhere near a decent level of C++ proficiency.
.cpp
file. – Kinlawinline
. – Naucratisinline
only relaxes the one definition rule, which is necessary if another translation unit usesClazz
– Rubidium