未命名的命名空间与私有变量

时间:2012-08-31 10:52:56

标签: c++ namespaces

我一直在阅读这里的其他问题,有些事让我感到困惑,希望可以解释。我确信这是一件简单的事情,但它暗指我。

所以在C ++中我们有私有变量只能在类中查看:

class MyClass
{
    private:
        int i;
};

但我们也可以使用未命名的命名空间:

namespace
{
    int i;
}

两者似乎都是该类的私有,但在第二种情况下,您无法从头文件中看到它们存在。从阅读其他问题看,函数是不同的,因为你不能将类对象传递给它们?但我不确定变量的区别在哪里。

第二种方式是否存在缺点,这意味着您仍然应该使用私有变量?

4 个答案:

答案 0 :(得分:14)

它们不一样。

匿名命名空间中的整数i将由MyClass的所有实例共享。

i中的私有整数MyClass对于每个类的实例化都是唯一的。

使用private的等价物是i静态:

//.h
class MyClass
{
    private:
        static int i;
};

并实例化单个共享i,如下所示:

//.cpp
int MyClass::i = 0;

答案 1 :(得分:5)

  

两人似乎都是私人的......

不,只有第一个是私人的。它是一个非静态成员变量;一个在类类型的每个对象中实例化。

第二个根本不在课堂上;它具有静态存储持续时间,因此可以为整个程序实例化一个。访问它的任何东西都访问与访问它的任何其他变量相同的变量。在一个未命名的命名空间中,它只能在定义它的翻译单元(即源文件)中访问;但是它可以被任何代码访问,而不仅仅是特定的类。

  

第二种方式是否存在缺点,这意味着您仍然应该使用私有变量?

如果你想在每个类对象中复制一个变量,那么你需要它是一个非静态成员。

如果要在所有对象之间共享它,那么由您决定是将其作为静态成员还是将其放在类的实现文件中的命名空间中。我经常做后者来简化类定义。缺点是访问不仅限于类,而是仅限于该文件中的任何其他内容,并且您无法从可能要放入标题的任何代码中访问它。

答案 2 :(得分:3)

命名空间与对象/类无关。特别是,如果你有两个对象,每个对象都有自己的私有变量副本。

答案 3 :(得分:3)

它们是完全不同的概念。私有数据成员仅对类可见,而在非静态情况下,每个类实例拥有其中一个。匿名命名空间允许您使代码仅可用于同一文件中的其他代码。因此,在单个int变量的情况下,与匿名命名空间位于同一位置的所有代码都会看到相同的单个变量。