C++:为什么必须声明私有(private)函数?

标签 c++ class function private declaration

为什么 C++ 中的类必须声明它们的私有(private)函数?有实际的技术原因(它在编译时的作用是什么)还是仅仅是为了一致性?

最佳答案

I asked why private functions had to be declared at all, as they don't add anything (neither object size nor vtable entry) for other translation units to know

如果你仔细想想,这类似于在文件中声明一些函数static。它从外部看不到,但它对编译器本身很重要。编译器想知道函数的签名,然后才能使用它。这就是你首先声明函数的原因。 请记住,C++ 编译器是一次性的,这意味着在使用之前必须声明所有内容。1

从程序员的角度来看,声明私有(private)函数仍然不是完全没用的。想象一下 2 个类,其中一个是另一个的 friend。 friend 分区的类2 需要知道该类的私有(private)内容(这个讨论变得很奇怪),否则他们无法使用它。

至于为什么 C++ 是这样设计的,我先说有历史原因:你不能在 C 中对结构进行切片,被 C++ 采用所以你不能对类进行切片 (并被其他从 C++ 分支出来的语言所采用)。我也猜想它是关于简单性:想象一下设计一种编译方法是多么困难,在这种方法中你可以在不同的头文件中拆分类,让你的源文件知道它,并防止其他人向你的类。

最后一点是,private 函数可以 影响 vtable 的大小。也就是说,如果它们是virtual


1 其实不完全。如果类中有内联函数,它们可以引用稍后在同一类中定义的函数。但可能这个想法是从单次传递开始的,后来添加了这个异常。

2 特别是内联成员函数。

关于C++:为什么必须声明私有(private)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11525574/

相关文章:

c++ - #警告和宏观评价

delphi - 定义方法的问题

python - 解释器可以通过哪些方式留下类定义?

c - 为什么我的函数中的 count 变量不增加?

c++ - 如何在 Windows 资源管理器中获取窗口的完整路径

C++ 模板与 STL 返回类型相结合

function - 为什么这个程序集产生 24 而不是 4?

javascript - 如何从闭包函数调用中返回相同的值 n 次?

c++ - 无法匹配重载的运算符

c++ - 执行一次类代码 C++