C++ 中的命名空间私有成员

ste*_*lla 3 c++ java namespaces

我正在阅读 Scott Meyrse C++,现在我正在阅读有关封装的部分。他说除非将数据成员声明为私有,否则无法封装数据成员。这很清楚。

但是由于我来自Java,拥有它的package-private方法和成员,我很感兴趣的是 C++ 是否允许我们做一些技巧来在命名空间中声明一些,以便在命名空间之外无法访问它。命名空间私有或类似的东西。我认为使用匿名命名空间的以下代码会很好:

namespace A {
    namespace { //anonymous namespace within the namespace
        int a;
    }
    void foo(){ std::cout << a << std::endl; }
}

int main()
{
    A::a = 2;
    A::foo();
}
Run Code Online (Sandbox Code Playgroud)

但效果很好:http : //coliru.stacked-crooked.com/a/b4690b9bb28dad29

cod*_*edd 5

我感兴趣的是 C++ 是否允许我们做一些技巧来在命名空间中声明一些,以便在命名空间之外无法访问它。

您不能拥有一个私有 命名空间,其中 C++ 语言本身将强制执行其隐私并以与私有成员相同的方式使外部世界无法访问它。

如果有的话,它必须通过在特定代码库中采用一致的命名约定来完成。

这在某种程度上类似于 Python 方法名称如何以前导下划线_作为前缀作为约定,以指示方法(或数据成员)被视为“私有”并且不应从外部访问。