类成员函数中的静态本地在类重新分配中幸存下来?

Posted

技术标签:

【中文标题】类成员函数中的静态本地在类重新分配中幸存下来?【英文标题】:Static local in class member function survives class reallocation? 【发布时间】:2009-08-29 02:47:25 【问题描述】:
class Foo

public:
    void bar();
;

void Foo::bar()

    static int n = 0;

    printf("%d\n", n++);


int main(int argc, char **argv)

    Foo *f = new Foo();
    f->bar();
    delete f;
    f = new Foo();
    f->bar();
    delete f;

    return 0;

delete'ing 和new'ing 再次上课之后,n 是否会重置为0?还是n 实际上是一个静态类成员(在所有实例中引用相同)?

换句话说,我应该得到

0
0

0
1

?

【问题讨论】:

【参考方案1】:

由于变量在函数中是静态的,所以它会是0,1因为内存不会因为它是静态的而被删除,即使变量是函数的一部分而不是类的一部分。

即使您删除了一个类的实例,这些函数仍然保留在该类的内存中,因为它们可以被该类的其他实例使用。

【讨论】:

这是有道理的。所以静态局部对于所有的类实例来说确实是一样的,因为它们实际上都在使用同一个函数实例。【参考方案2】:

0 1

'n' 实际上是具有不同范围的静态类成员。它本质上与任何其他上下文(成员函数、全局等)的函数中的静态变量相同

【讨论】:

【参考方案3】:

'n' 是函数 Foo::bar 中的静态变量。无论您可能创建或销毁多少个 Foo 实例,该函数都只有一个副本。

【讨论】:

以上是关于类成员函数中的静态本地在类重新分配中幸存下来?的主要内容,如果未能解决你的问题,请参考以下文章

C++类中的静态成员函数以及静态成员变量

第十二章 类和动态内存分配

为啥静态成员函数只能在类定义中声明为静态,而不能在其自己的定义中声明?

静态数据成员 和 静态成员函数

C++ 类中的静态成员变量,静态成员函数

类--其他特性,作用域,构造函数,静态成员