未命名的命名空间与私有变量
Unnamed namespaces vs private variables
我一直在阅读这里的其他问题,有些地方让我感到困惑,希望能解释清楚。我确信这是一件简单的事情,但它在暗指我。
因此,在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
变量的情况下,与匿名命名空间在同一位置定义的所有代码都会看到相同的单个变量。
- 在命名空间 c++ 中正确声明 extern 变量
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 在命名空间中定义变量
- 初始化命名空间中的变量是否类似于将它们初始化为类成员?
- 如何访问嵌套在命名命名空间中的未命名命名空间变量?
- 命名空间内C++变量声明
- C++从 std::async 函数读取命名空间中的全局变量标志
- 在命名空间中声明变量
- 如何在命名空间中初始化外部变量
- 无法在命名空间范围内分配变量
- 在命名空间中定义变量,但在测试中获取空值
- 在Visual Studio中生成的匿名命名空间变量的损坏名称的数字部分是什么意思
- C++:.cpp中"Redeclare"外部命名空间变量
- 为什么主可执行文件和 dlopen 加载的共享库共享命名空间静态变量的一个副本?
- 在同一命名空间中声明变量和函数是否出错?[C++]
- 作用域中定义的变量与注入该作用域的命名空间变量
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 获取封装在命名空间中的静态变量地址
- 命名空间中的全局变量会导致"undefined reference to"
- 使用命名空间的全局变量