Да, вы можете достичь степени инкапсуляции, используя пространства имен.
Очевидное ограничение заключается в том, что вы не можете создавать экземпляры пространств имен, поэтому то, что вы инкапсулируете в пространство имен, обычно не поддерживает экземпляры.,Итак, если вы хотите инкапсулировать что-то вроде «как была настроена программа для запуска», пространство имен, вероятно, работает нормально.Если вы хотите инкапсулировать данные, которые вы собираетесь хранить о каждом элементе в базе данных элементов, есть вероятность, что пространство имен не окажет большой (если вообще) помощь.
Чтобы действительно ограничить доступ кданные, вы должны использовать пространства имен в сочетании с другими функциями.В частности, имена в анонимном пространстве имен видимы (без квалификации) для кода в той же единице перевода - но совершенно невидимы вне этой единицы перевода.
// 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
.