我正在阅读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();
}
答案 0 :(得分:3)
我很感兴趣,如果C ++允许我们做一些技巧来声明一些 在命名空间中,以便它在命名空间之外不可访问。
您不能拥有私有命名空间,其中C ++语言本身将强制其隐私并使其与私有成员一样对外部世界不可访问。
如果有的话,必须通过在特定代码库中采用一致的命名约定来完成。
在某种程度上,这类似于Python方法名称以前导下划线_
为前缀的约定,表示方法(或数据成员)被视为“私有”,不应该是从外面进入。
答案 1 :(得分:1)
namespace {//命名空间中的匿名命名空间
这是未命名的命名空间声明,即它可以用internal linkage声明,这意味着在未命名的命名空间中声明的任何名称都具有内部链接。
所以允许做A :: a = 2
如果您将该命名空间命名为
namespace B
然后你必须这样做:
A::B::a = 2;