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

Fir*_*gon 7 c++ namespaces

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

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

class MyClass
{
    private:
        int i;
};
Run Code Online (Sandbox Code Playgroud)

但我们也可以拥有未命名的命名空间:

namespace
{
    int i;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*ood 14

他们不一样.

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

对于类的每个实例化,私有整数iin MyClass将是唯一的.

等效使用private将是i静态:

//.h
class MyClass
{
    private:
        static int i;
};
Run Code Online (Sandbox Code Playgroud)

并实例化这样一个共享i:

//.cpp
int MyClass::i = 0;
Run Code Online (Sandbox Code Playgroud)


Mik*_*our 5

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

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

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

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

如果要在每个类对象中获得变量的副本,则需要将其作为非静态成员.

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