类成员访问说明符和二进制代码

时间:2010-05-03 16:55:18

标签: c++ access-specifier

我理解典型的访问说明符是什么,以及它们的含义。 “公共”成员可以在任何地方访问,“私人”成员只能由同一个班级和朋友等访问。

我想知道的是,如果有的话,这等同于较低级别的术语。他们之间的任何编译后功能差异是否超出了他们所使用的语言(在这种情况下是c ++)强加的高级限制(什么可以访问什么)。

另一种表达方式 - 如果这是一个完美的世界,程序员总是做出很好的选择(比如不能访问后来可能会改变的成员,并且只使用明确定义的成员,这些成员应该在实现之间保持不变),他们是否有任何理由用这些东西?

5 个答案:

答案 0 :(得分:8)

访问说明符仅用于编译目的。程序分配中的任何内存都可以被可执行文件的任何部分访问;在运行时没有公共/私人概念

答案 1 :(得分:1)

迈克尔的回答是正确的。访问说明符不会直接影响生成的代码。

但是,访问说明符可以解决模糊的标识符/重载错误,否则会阻止编译。

class A {
private:
    int x;
};

class B {
protected:
    int x;
};

class C : public A, public B {
public:
    int &get_x() { return x; } // only B::x is accessible, no error.
};

所以他们肯定比限制程序员更有目的。

答案 2 :(得分:0)

您的问题的答案可能因编译器而异,但一般情况下没有区别。人们可以设想一个环境,对于那些不同的可访问性,编译的代码可能具有不同的特征,但我不知道存在任何特征。

答案 3 :(得分:0)

程序员只有拥有正确的信息才能做出正确的选择。访问修饰符是一种向程序员发出不应触及某些事物的信号的方式,它具有强制执行正确行为的附带好处。

没有运行时影响。您可以编写一个具有正确访问修饰符的程序,使用c++ -Dprotected=public -Dprivate=public file.cc构建它,它应该构建并生成几乎完全相同的代码(有一些假设的警告,例如类的数据布局)。

答案 4 :(得分:0)

编译后,您将留下机器代码(程序集),它没有“公共”或“私有”(或类,成员等)的概念。一切都只是一个内存地址(无论是代码还是数据),并且可以像任何其他内存地址一样进行访问。整个公共\私有区别(以及高级语言中几乎所有其他构造)纯粹是为了程序员的利益,允许编译器强制执行一组旨在实现代码意图的规则更清楚,并帮助避免潜在的错误。编译完成后,您的代码不知道它最初编写的语言,更不用说使用的访问说明符类型了。

话虽这么说,有可能装配一个编译器,以便每当调用private类成员函数时它就会修改代码,以便检测函数被不适当地调用的时候(添加一个额外的参数并设置当从类中调用函数时,它达到某个预期值;从类外部调用函数将提供错误的值)。这种方法的问题是你现在做什么?锁起来?什么都不做,并返回无效数据?这些类型的问题在编译时(相对)容易检测和纠正,因此很少看到在运行时(在调试或代码分析工具之外)强制执行此类事情。

相关问题