C++ 中的命名空间私有成员

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

我正在阅读 Scott Meyers C++,现在正在阅读有关封装的部分。他说,除非将数据成员声明为私有,否则无法封装它们。这很清楚。

但是由于我来自 Java,拥有其

package-private
方法和成员,所以我感兴趣的是 C++ 是否允许我们做一些技巧来在命名空间中声明某些内容,以便在命名空间之外无法访问它。命名空间私有或类似的东西。我认为以下使用匿名命名空间的代码就可以了:

namespace A {
    namespace { //anonymous namespace within the namespace
        int a;
    }
    void foo(){ std::cout << a << std::endl; }
}

int main()
{
    A::a = 2;
    A::foo();
}

但效果很好:http://coliru.stacked-crooked.com/a/b4690b9bb28dad29

java c++ namespaces
2个回答
5
投票

我感兴趣的是 C++ 是否允许我们做一些技巧来声明一些 在命名空间中,以便在命名空间之外无法访问它。

您不能拥有一个 private 命名空间,其中 C++ 语言本身将强制执行其隐私,并以与私有成员相同的方式使其无法被外部世界访问。

如果有的话,必须通过在特定代码库中采用一致的命名约定来完成。

这在某种程度上类似于 Python 方法名称以前导下划线作为前缀

_
作为约定,表明该方法(或数据成员)被视为“私有”并且不应从外部访问.


2
投票

namespace { //命名空间内的匿名命名空间

这是未命名的命名空间声明,即它可以使用内部链接进行声明,这意味着在未命名的命名空间中声明的任何名称都具有内部链接。

所以允许 A::a = 2

如果您将该命名空间命名为

namespace B

那么你必须做:

A::B::a = 2;
© www.soinside.com 2019 - 2024. All rights reserved.