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

时间:2019-09-27 17:29:31

标签: c++ encapsulation

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

2 个答案:

答案 0 :(得分:4)

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

一个明显的限制是您不能创建名称空间的实例,因此封装在名称空间中的内容通常也不支持实例。因此,如果您想封装诸如“程序如何配置运行”之类的名称空间,则它可能工作正常。如果要封装数据,则要在项目数据库中存储每个项目的数据,则很有可能名称空间不会提供太多帮助(如果有的话)。

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

// 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

答案 1 :(得分:3)

种类。 Per wikipedia封装是

  

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

如果您只关注第一部分,那么答案是肯定的。它将功能和变量分组到一个盒子中。

如果使用后半部分,则答案为否。命名空间中的所有内容对于外部都是可见的,并且可以访问。基本上,您要做的就是间接访问。


如果要封装,只需使用一个类。他们是为此而建造的。