Why do classes in C++ have to declare their private functions? Has it actual technical reasons (what is its role at compile time) or is it simply for consistency’s sake?
Share
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
If you think about it, this is similar to declaring some functions
staticin a file. It’s not visible from the outside, but it is important for the compiler itself. The compiler wants to know the signature of the function before it can use it. That’s why you declare functions in the first place. Remember that C++ compilers are one pass, which means everything has to be declared before it is used.1From the programmer’s point of view, declaring private functions is still not completely useless. Imagine 2 classes, one of which is the
friendof the other. The friendzoned class2 would need to know how the privates of that class look like, (This discussion is getting weird) otherwise they can’t use it.As to why exactly C++ was designed in this way, I would first say there is the historical reason: the fact that you can’t slice a struct in C, was adopted by C++ so you can’t slice a class (and adopted by other languages branched from C++, too). I’d also guess that it’s about simplicity: Imagine how difficult it would be to devise a method of compilation in which you can split the class among different header files, let your source files know about it, and prevent others from adding stuff to your class.
A final note is that,
privatefunctions can affect vtable size. That is, if they arevirtual.1 Actually not entirely. If you have inline functions in the class, they can refer to functions later defined in the same class. But probably the idea started from single pass and this exception later added to it.
2 It’s inlined member functions in particular.