首页 > 解决方案 > 我们可以使用命名空间实现封装吗?

问题描述

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

标签: c++encapsulation

解决方案


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

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

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

// 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 中的代码也可以将引用或指针传递foo给 A.cpp 之外的一些其他代码,以使其访问foo.


推荐阅读