AguaSal Asked: 2020-02-19 05:09:21 +0800 CST 2020-02-19 05:09:21 +0800 CST 2020-02-19 05:09:21 +0800 CST 全局静态变量和类变量静态有什么区别? 772 我正在自己研究 C++ 的更多功能,并且遇到过,将 a 声明为全局变量与在类或结构中声明相同的有static什么区别?static int x = 2 PS:我也想知道一个方法是如何与static. c++ 3 Answers Voted Best Answer Trauma 2020-02-19T07:26:02+08:002020-02-19T07:26:02+08:00 static有几个用途: 在自变量中: static int algo = 5; 这个变量,除了在程序的整个生命周期内都有一个持续时间,只在声明它的源文件中可见;也就是说,如果您在 2 个文件中.cpp声明了 2 个变量static int algo,则它们中的每一个都是相互独立的,并且它们仅在文件本身中可见。 在 C++ 中,可以使用namespace匿名实现相同的目标: namespace { int Algo = 0; } 这达到了相同的效果:如此声明的变量仅在声明它们的源文件中可见。 在类成员变量中: class Class { static int Algo; }; 如此声明的类的成员变量不需要类的实例即可访问它;也就是说,你不需要 Class instance; instance.Algo = 0; 你可以直接做 Class::Algo = 0; 这意味着它不会在每个实例中占用空间,而是在程序的整个生命周期中占用一个内存位置。 在自动变量中: int algo( void ) { static int X = 10; return ++X; } 像这样使用,它们在调用之间继续运行:第一次调用时algo( ),它返回11。第二次,它会返回12;第三次13,…… 它们还具有一个特殊性:在其他使用模式中,没有定义变量何时初始化,与声明它的源文件相关;如果您有 3 个源文件,每个文件有 1 个变量static,您不知道每个源文件的初始化顺序:第一个文件或另一个文件。 static然而,在自动变量中,无论您从哪里调用函数,它们都会在您第一次使用它们时被初始化。 Gytree 2020-02-19T05:57:49+08:002020-02-19T05:57:49+08:00 区别在于变量的范围( scope ),而全局变量 x 可以从程序中的任何位置访问 cout<<x<<endl; 如果声明在一个类中,您只能通过首先引用声明它的类来访问它。 cout<< miclass::x << endl; 我在myclass中声明的变量x的范围由声明它的类定义。 user4717 2020-02-19T07:21:10+08:002020-02-19T07:21:10+08:00 ...将 a 声明static int x = 2为全局变量... 将 x 的链接类型设置为“内部链接”;每个翻译单元都会有x不同的翻译单元。如果它在头文件中声明,则包含它的每个 cpp 都将有自己的 x 声明,独立于其他 cppeces。 ...并在类或结构中声明相同的内容? 这是另一回事。在这种情况下,将为您的类或结构的每个实例创建一个唯一的 x ;您将拥有相同的 x。
static
有几个用途:在自变量中:
这个变量,除了在程序的整个生命周期内都有一个持续时间,只在声明它的源文件中可见;也就是说,如果您在 2 个文件中
.cpp
声明了 2 个变量static int algo
,则它们中的每一个都是相互独立的,并且它们仅在文件本身中可见。在 C++ 中,可以使用
namespace
匿名实现相同的目标:这达到了相同的效果:如此声明的变量仅在声明它们的源文件中可见。
在类成员变量中:
如此声明的类的成员变量不需要类的实例即可访问它;也就是说,你不需要
你可以直接做
这意味着它不会在每个实例中占用空间,而是在程序的整个生命周期中占用一个内存位置。
在自动变量中:
像这样使用,它们在调用之间继续运行:第一次调用时
algo( )
,它返回11
。第二次,它会返回12
;第三次13
,……它们还具有一个特殊性:在其他使用模式中,没有定义变量何时初始化,与声明它的源文件相关;如果您有 3 个源文件,每个文件有 1 个变量
static
,您不知道每个源文件的初始化顺序:第一个文件或另一个文件。static
然而,在自动变量中,无论您从哪里调用函数,它们都会在您第一次使用它们时被初始化。区别在于变量的范围( scope ),而全局变量 x 可以从程序中的任何位置访问
如果声明在一个类中,您只能通过首先引用声明它的类来访问它。
我在myclass中声明的变量x的范围由声明它的类定义。
将 x 的链接类型设置为“内部链接”;每个翻译单元都会有
x
不同的翻译单元。如果它在头文件中声明,则包含它的每个 cpp 都将有自己的 x 声明,独立于其他 cppeces。这是另一回事。在这种情况下,将为您的类或结构的每个实例创建一个唯一的 x ;您将拥有相同的 x。