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