7

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

因此,在 C++ 中,我们有只能在类中查看的私有变量:

class MyClass
{
    private:
        int i;
};

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

namespace
{
    int i;
}

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

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

4

4 回答 4

15

他们不一样。

匿名命名空间中的整数i将由MyClass.

对于类的每个实例化,私有整数iinMyClass将是唯一的。

等效的使用private是使i静态:

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

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

//.cpp
int MyClass::i = 0;
于 2012-08-31T10:56:24.613 回答
6

两者似乎都是班级私有的......

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

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

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

如果您想要每个类对象中的变量副本,那么您需要它是一个非静态成员。

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

于 2012-08-31T11:56:30.250 回答
3

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

于 2012-08-31T10:56:11.200 回答
3

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

于 2012-08-31T10:57:57.557 回答