代码之家  ›  专栏  ›  技术社区  ›  pdehaan

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

  •  3
  • pdehaan  · 技术社区  · 16 年前

    我想知道的是,如果有的话,这在较低的层次上等同于什么。它们之间的编译后功能差异是否超出了它们所使用的语言(在本例中是c++)施加的高级限制(什么可以访问什么)。

    5 回复  |  直到 16 年前
        1
  •  9
  •   Michael Mrozek    16 年前

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

        2
  •  2
  •   Potatoswatter    16 年前

    迈克尔的回答是对的。访问说明符不会直接影响结果代码。

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

    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.
    };
    

    所以它们肯定比限制程序员有更高的用途。

        3
  •  1
  •   Eric Mickelsen    16 年前

    根据编译器的不同,您的问题的答案可能会有所不同,但通常不会有什么不同。我们可以设想这样一个环境,编译后的代码对于这些不同的可访问性可能具有不同的特性,但我不知道存在什么。

        4
  •  1
  •   Marcelo Cantos    16 年前

    只有掌握了正确的信息,程序员才能做出正确的选择。访问修饰符是一种向程序员发出不应触碰某些东西的信号的方法,它的副作用是强制执行正确的行为。

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

        5
  •  1
  •   bta    16 年前

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