是否可以使用命名空间来实现封装?
Can we achieve encapsulation using namespace?
在c++中可以使用命名空间实现封装吗?还是依赖于编译器?
是的,您可以使用名称空间实现一定程度的封装。
明显的限制是您不能创建名称空间的实例,因此您封装在名称空间中的东西通常也不支持实例。所以,如果你想封装像 "how was the program configured to run" 这样的东西,命名空间可能工作得很好。如果您想封装要存储在项目数据库中的每个项目的数据,命名空间可能不会有太大帮助(如果有的话)。
要真正限制对数据的访问,您必须将命名空间与其他功能结合使用。特别是,匿名命名空间中的名称对同一翻译单元中的代码可见(无需限定)——但在该翻译单元之外完全不可见。
// 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
中的代码可以访问它。与 class 的成员非常相似,A.cpp 中的代码也可以将 foo
的引用或指针传递给 A.cpp 之外的其他代码,以使其能够访问 foo
.
有点。 Per wikipedia封装是
the bundling of data with the methods that operate on that data, or the restricting of direct access to some of an objects components.
如果您只关注第一部分,那么答案是肯定的。它允许将函数和变量分组到一个框中。
如果你使用下半部分,那么答案是否定的。命名空间中的所有内容对外部都是可见的,并且可以访问。基本上你在间接访问中所做的一切。
如果要封装,就用一个class。他们是为此而建的。
在c++中可以使用命名空间实现封装吗?还是依赖于编译器?
是的,您可以使用名称空间实现一定程度的封装。
明显的限制是您不能创建名称空间的实例,因此您封装在名称空间中的东西通常也不支持实例。所以,如果你想封装像 "how was the program configured to run" 这样的东西,命名空间可能工作得很好。如果您想封装要存储在项目数据库中的每个项目的数据,命名空间可能不会有太大帮助(如果有的话)。
要真正限制对数据的访问,您必须将命名空间与其他功能结合使用。特别是,匿名命名空间中的名称对同一翻译单元中的代码可见(无需限定)——但在该翻译单元之外完全不可见。
// 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
中的代码可以访问它。与 class 的成员非常相似,A.cpp 中的代码也可以将 foo
的引用或指针传递给 A.cpp 之外的其他代码,以使其能够访问 foo
.
有点。 Per wikipedia封装是
the bundling of data with the methods that operate on that data, or the restricting of direct access to some of an objects components.
如果您只关注第一部分,那么答案是肯定的。它允许将函数和变量分组到一个框中。
如果你使用下半部分,那么答案是否定的。命名空间中的所有内容对外部都是可见的,并且可以访问。基本上你在间接访问中所做的一切。
如果要封装,就用一个class。他们是为此而建的。