【问题标题】:Unnamed namespaces vs private variables未命名的命名空间与私有变量
【发布时间】:2012-08-26 04:26:00
【问题描述】:

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

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

class MyClass
{
    private:
        int i;
};

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

namespace
{
    int i;
}

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

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

【问题讨论】:

    标签: c++ namespaces


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        它们不一样。

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

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

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

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

        然后像这样实例化一个共享的i

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

        【讨论】:

        • 现在你解释清楚了。我知道在某些情况下它们比静态更受欢迎,但是由于某种原因,这两个陈述在我的脑海中并没有联系在一起:-) 谢谢
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-29
          • 2018-02-03
          • 2012-07-19
          • 2011-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多