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

Anc*_*rio 29 c++ private class declaration function

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

Sha*_*baz 21

我问为什么必须要声明私有函数,因为它们不会为其他翻译单元添加任何内容(对象大小和vtable条目)

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

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

至于为什么C++正是以这种方式设计的,我首先要说的是历史原因:你不能在C中切片结构的事实被C++采用,所以你不能切片一个类(并采用其他语言也从C++分支出来.我还猜测它是关于简单性的:想象一下设计一种编译方法是多么困难,你可以在不同的头文件之间拆分类,让你的源文件知道它,并防止其他人添加你的东西类.

最后要注意的是,private函数影响vtable的大小.也就是说,如果是的话virtual.


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

2 特别是内联成员函数.

  • 在使用之前声明签名只是模糊地与他们为什么必须在班级本身相关.friendzoned类不需要知道另一个的私有,它的成员函数定义需要知道私有.这也可以在课堂之后/之外.你可以用模板做一些有趣的事情,可以说是将一个类定义分成两部分.这提醒我,带有内联函数的类定义_are_两遍,而不是一遍.这就是为什么你可以在成员函数定义中使用成员/函数_before_声明成员. (2认同)

Moo*_*uck 20

您必须在类本身的定义中声明所有成员,以便编译器知道允许哪些函数成为成员.否则,第二个程序员可能(不小心?)出现并添加成员,犯错并违反对象的保证,导致未定义的行为和/或随机崩溃.

  • 我想你刚刚描述了Python类=) (10认同)