c++ - 我们可以使用命名空间实现封装吗?
问题描述
我们可以在 c++ 中使用命名空间来实现封装吗?还是它依赖于编译器?
解决方案
是的,您可以使用命名空间实现一定程度的封装。
明显的限制是你不能创建命名空间的实例,所以你封装在命名空间中的东西通常也不支持实例。因此,如果您想封装诸如“程序如何配置为运行”之类的内容,命名空间可能可以正常工作。如果您想封装您将要存储的关于每个项目的数据到项目数据库中,那么命名空间可能不会有太大帮助(如果有的话)。
要真正限制对数据的访问,您必须将命名空间与其他功能结合使用。特别是,匿名命名空间中的名称对于同一翻译单元中的代码是可见的(无需限定)——但在该翻译单元之外完全不可见。
// 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
.
推荐阅读
- java - unchecked call to getDeclaredConstructor(Class
- html - 我如何重复一个函数直到 x 发生?
- if-statement - 如果连续数字小于 Google 表格计数
- camera - 为什么 Apple FaceTime 高清摄像头不提供 MJPEG/DMB1 像素格式
- unity3d - 使用 RectTransform.sizeDelta 缩放游戏对象和孩子
- javascript - 为什么`"12:34" <"123:45"`等于`false`?
- json - JQ:将数组与另一个文件中的对象列表组合
- python - 从现有的数据框 pandas 创建新的数据框
- visual-studio - SSAS 表格项目不显示查询模式选项
- python - 无法退出循环