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

时间:2015-10-22 03:56:14

标签: java c++ namespaces

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

但是因为我来自 Java 拥有package-private方法和成员,所以我很感兴趣,如果C ++允许我们做一些技巧来在命名空间中声明一些,这样它就无法访问在命名空间之外。 Namespace-private或类似的东西。我认为使用匿名命名空间的以下代码可以正常:

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

int main()
{
    A::a = 2;
    A::foo();
}

但它运作良好:http://coliru.stacked-crooked.com/a/b4690b9bb28dad29

2 个答案:

答案 0 :(得分:3)

  

我很感兴趣,如果C ++允许我们做一些技巧来声明一些   在命名空间中,以便它在命名空间之外不可访问。

您不能拥有私有命名空间,其中C ++语言本身将强制其隐私并使其与私有成员一样对外部世界不可访问。

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

在某种程度上,这类似于Python方法名称以前导下划线_为前缀的约定,表示方法(或数据成员)被视为“私有”,不应该是从外面进入。

答案 1 :(得分:1)

  

namespace {//命名空间中的匿名命名空间

这是未命名的命名空间声明,即它可以用internal linkage声明,这意味着在未命名的命名空间中声明的任何名称都具有内部链接。

所以允许做A :: a = 2

如果您将该命名空间命名为

namespace B

然后你必须这样做:

A::B::a = 2;