我知道“public”让程序员可以访问成员,属性或其他类,而“私有”则不允许访问。
但我想知道,在编译过程中它是如何工作的(g ++)?
我很难解释我的问题。 我知道会产生什么影响,我只想了解更多关于编译器将做什么的信息,以及允许公共或私人访问的操作。
答案 0 :(得分:3)
当您声明(或定义)一个对象时,编译器会创建某种包含该对象属性的内部记录。对于C ++编译器,其中一个属性将描述成员对象的可访问性。然后,当编译器遇到试图访问成员的代码时,它会根据accessibility属性检查代码的标识(类的一部分/派生类的一部分/两者),以确定是否允许访问。
然而,除此之外不可能进行更多细节,因为编制者之间的细节会有所不同。
如果你想专门针对g ++进行一个非常详细的解释,那将会变得困难和丑陋。问题是g ++ AST的代码是(或至少最初是)用C语言编写的,但树中的节点基本上是多态的。为了管理它,他们有一组(相当大)的宏来模拟类似于C ++中的dynamic_cast的东西。为每种类型的节点分配一个ID,因此宏检查该节点是否包含正确的ID以表示您尝试访问的类型,并且如果数据类型正确,则可以访问该数据。
在这些宏中有许多谓词宏,可以让您查询特定节点是否具有某些特定属性。它已经足够长了,因为我看起来我不能保证它,但如果内存服务其中一个将让你查询名称的可访问性。