我正在阅读Scott Meyers的C++书籍,现在我正在学习关于封装的部分。他说,除非将数据成员声明为private,否则无法将其封装起来。这是清楚的。
但是,由于我之前主要使用Java,而Java有其“包私有(package-private)”方法和成员,因此我想知道C++是否允许我们使用一些技巧,在命名空间中声明一些不可从命名空间外访问的内容。类似于命名空间私有(namespace-private)之类的东西。我认为下面使用匿名命名空间的代码会很好:
但是,由于我之前主要使用Java,而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();
}
internal
的嵌套命名空间。它仍然可以访问 - 任何人都可以编写A::internal::a
- 但它清楚地向外部任何人发出信号,表明他们即将依赖于内部实现细节,这可能会带来风险。未命名的命名空间则完全不同 - 它包含的定义仅限于此翻译单元(也称源文件)。 - Igor Tandetnik