类方法中的静态variables
有人可以请解释如何静态方法variables在C ++中工作…如果我有以下类:
class A { void foo() { static int i; i++; } }
如果我声明A的多个实例,在一个实例上调用foo()是否会在所有实例上增加静态variablesi? 还是只有被召唤的那个?
我假定每个实例都有自己的i副本,但是通过一些我似乎已经指出的代码。
由于class A
是一个非模板类,而A::foo()
是一个非模板函数。 程序里面只有一个static int i
。
A
对象的任何实例都会影响同一个i
而且i
生命周期将会保留在整个程序中。 添加一个例子:
A o1, o2, o3; o1.foo(); // i = 1 o2.foo(); // i = 2 o3.foo(); // i = 3 o1.foo(); // i = 4
不幸的是,关键字static
在C ++中有几个不相关的含义
-
当用于数据成员时,这意味着数据是在类中分配的,而不是在实例中分配的 。
-
当用于函数内部的数据时,这意味着数据是静态分配的, 在块第一次进入时被初始化并持续到程序退出。 此外,variables只在函数内部可见。 本地静态的这个特点常常被用来实现单身人士的懒惰build设。
-
当在编译单元级别(模块)上使用时,这意味着该variables就像是一个全局variables(即,在
main
运行之前分配和初始化,并在main
出口之后被销毁),但是该variables在其他编译单元中将不可访问或可见 。
我增加了对每个用途最重要的部分的一些重点。 使用(3)有利于未命名的命名空间,也允许未导出的类声明。
在你的代码中, static
关键字与2的含义一起使用,与类或实例无关……它是函数的variables,只有一个副本。
正如iammilind所说的那样,如果函数是一个模板函数(因为在这种情况下函数本身可以在程序中存在许多不同的副本),那么可能有多个该variables的实例。 即使在这种情况下,类和实例也是不相关的……参见下面的例子:
#include <stdio.h> template<int num> void bar() { static int baz; printf("bar<%i>::baz = %i\n", num, baz++); } int main() { bar<1>(); // Output will be 0 bar<2>(); // Output will be 0 bar<3>(); // Output will be 0 bar<1>(); // Output will be 1 bar<2>(); // Output will be 1 bar<3>(); // Output will be 1 bar<1>(); // Output will be 2 bar<2>(); // Output will be 2 bar<3>(); // Output will be 2 return 0; }
简单的答案:静态variables,无论它们是(非模板化)类还是(非模板化)函数的成员,都在技术上performance得像一个全局标签,其范围仅限于类或函数。
谢谢你的好例子! 会有一种方法来实际实现的东西,使静态我的具体范围的实例,所以,例如o1.foo(); // i = 1和$ o2.foo(); // i> = 1 …? – 刺痛
我认为唯一的方法必须是创build一个bool类成员variables,然后条件初始化的值,只有在初始化时更改它的值。 我可以想象一个潜在的更复杂的方法,其中一个静态地图variables的实例作为关键,但似乎有点复杂。
我曾经离开过一个const char *,它是一个静态的本地(在成员函数中)指向另一个c风格的string,实际上是该类的一个实例成员。 在这种情况下,对象的析构函数释放了实例指针的内存,并且类的下一个实例具有垃圾值,因为运行时将静态局部视为已初始化,即使该静态局部被指向不应该的位置。
静态局部variables最容易在全局函数或静态成员函数中使用。
上面介绍了模板行为。 线程安全性如何(或者,如果我没有错,缺less)?