我们可以使用命名空间实现封装吗?



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

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

明显的限制是您无法创建命名空间的实例,因此您封装在命名空间中的内容通常也不支持实例。因此,如果您想封装诸如"程序如何配置为运行"之类的内容,则命名空间可能工作正常。如果要将要存储的有关每个项目的数据封装在项目数据库中,则命名空间可能不会有太大帮助(如果有的话(。

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

// 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中的代码可以访问它。与类的成员非常相似,A.cpp 中的代码也可以传递指向 A.cpp 外部其他代码foo的引用或指针,以使其访问foo

有点。 根据维基百科的封装是

将数据与对该数据进行操作的方法捆绑在一起,或限制对某些对象组件的直接访问。

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

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


如果你想要封装,只需使用一个类。 它们是为此而生的。

最新更新