Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未命名名称空间与私有变量_C++_Namespaces - Fatal编程技术网

C++ 未命名名称空间与私有变量

C++ 未命名名称空间与私有变量,c++,namespaces,C++,Namespaces,我一直在阅读关于这里的其他问题,有些问题让我感到困惑,希望能解释清楚。我相信这是一件简单的事情,但它暗指我 在C++中,我们只有在类中可见的私有变量: class MyClass { private: int i; }; 但我们也可以有未命名的名称空间: namespace { int i; } 两者似乎都是类私有的,但在第二种情况下,您无法从头文件中看到它们的存在。从阅读其他问题来看,函数似乎是不同的,因为您不能将类对象传递给它们?但我不确定变量之间的区别是

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

在C++中,我们只有在类中可见的私有变量:

class MyClass
{
    private:
        int i;
};
但我们也可以有未命名的名称空间:

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


第二种方法是否有一个缺点,即仍然应该使用私有变量?

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

它们不一样

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

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

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

//.h
class MyClass
{
    private:
        static int i;
};
并实例化单个共享的
i
,如下所示:

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

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

两者似乎都是班上的私人物品

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

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

第二种方法是否有一个缺点,即您仍然应该使用私有变量

如果希望在每个类对象中都有一个变量的副本,则需要它是非静态成员


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

现在您可以解释这一点了。我知道在某些情况下,它们比静力学更受欢迎,但出于某种原因,这两种说法在我的脑海中并不一致:-)谢谢