我们可以使用c ++中的命名空间实现封装吗?还是依赖于编译器?
答案 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封装是
将数据与对数据进行操作的方法捆绑在一起,或者限制对某些对象组件的直接访问。
如果您只关注第一部分,那么答案是肯定的。它将功能和变量分组到一个盒子中。
如果使用后半部分,则答案为否。命名空间中的所有内容对于外部都是可见的,并且可以访问。基本上,您要做的就是间接访问。
如果要封装,只需使用一个类。他们是为此而建造的。