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

问题描述 投票:0回答:2

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

c++ encapsulation
2个回答
2
投票

种类。 Per wikipedia封装为

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

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

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


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


1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.