C++ 私有(private)真的是私有(private)的吗?

标签 c++ private encapsulation data-integrity access-specifier

我正在尝试 C++ 中 private 访问说明符的有效性。如下:

界面:

// class_A.h

class A
{
public:
    void printX();
private:
    void actualPrintX();
    int x;
};

实现:

// class_A.cpp
void A::printX()
{
    actualPrintX();
}

void A::actualPrintX()
{
    std::cout << x:
}

我将它内置到静态库 (.a/.lib) 中。我们现在有一个 class_A.h 和 classA.a(或 classA.lib)对。 我编辑了 class_A.h 并从中删除了 private:

现在在另一个 classTester.cpp 中:

#include "class_A.h"    // the newly edited header

int main()
{
    A a;

    a.x = 12;           // both G++ and VC++ allowed this!
    a.printX();         // allowed, as expected
    a.actualPrintX();   // allowed by G++, VC++ gave a unresolved linker error

    return 0;
}

我知道在篡改库的标题后,所有的赌注都被取消了(我的意思是,系统完整性等)尽管方法很老套,但这真的允许吗?有没有办法阻止这个?还是我在这里做错了什么?

最佳答案

private 不是一种安全机制。这是一种传达意图和隐藏程序其他部分不需要知道的信息的方式,从而降低了整体复杂性。

拥有两个不同的头文件不符合标准,因此从技术上讲,您进入了未定义的行为领域,但实际上,正如您所发现的,大多数编译器不会在意。

关于C++ 私有(private)真的是私有(private)的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2273091/

相关文章:

c++ - 在程序中一起使用 If 和 Switch 语句

c++ - 对成员模板函数的访问控制

javascript - 将我的变量放在命名空间下

rust - 元组struct构造函数提示私有(private)字段

c++ - 封装类的用户输入数据

c# - 为什么要封装这个字段?

c++ - 是否可以通过另一个程序调用一个程序

c++ - 如何测试应用程序

c++ - QT QTextBrowser 左键单击时禁用写入位置

java - 比较类 equals 函数适用于私有(private)变量?