是否可以使用命名空间来实现封装?

Can we achieve encapsulation using namespace?

在c++中可以使用命名空间实现封装吗?还是依赖于编译器?

是的,您可以使用名称空间实现一定程度的封装。

明显的限制是您不能创建名称空间的实例,因此您封装在名称空间中的东西通常也不支持实例。所以,如果你想封装像 "how was the program configured to run" 这样的东西,命名空间可能工作得很好。如果您想封装要存储在项目数据库中的每个项目的数据,命名空间可能不会有太大帮助(如果有的话)。

要真正限制对数据的访问,您必须将命名空间与其他功能结合使用。特别是,匿名命名空间中的名称对同一翻译单元中的代码可见(无需限定)——但在该翻译单元之外完全不可见。

// A.cpp
namespace { 
    int foo;
}

int bar() {
    // this code has free access to foo
}

// B.cpp
int baz() { 
    // this code has no access to foo
}

所以在这种情况下,我们封装了对foo的访问,因此只有A.cpp中的代码可以访问它。与 class 的成员非常相似,A.cpp 中的代码也可以将 foo 的引用或指针传递给 A.cpp 之外的其他代码,以使其能够访问 foo.

有点。 Per wikipedia封装是

the bundling of data with the methods that operate on that data, or the restricting of direct access to some of an objects components.

如果您只关注第一部分,那么答案是肯定的。它允许将函数和变量分组到一个框中。

如果你使用下半部分,那么答案是否定的。命名空间中的所有内容对外部都是可见的,并且可以访问。基本上你在间接访问中所做的一切。


如果要封装,就用一个class。他们是为此而建的。