为了账号安全,请及时绑定邮箱和手机立即绑定

成员函数中的静态变量

成员函数中的静态变量

C++
慕莱坞森 2019-12-11 10:09:22
有人可以解释一下成员函数中的静态变量如何在C ++中工作。给定以下类别:class A {   void foo() {      static int i;      i++;   }}如果我声明的多个实例A,则foo()在一个实例上调用是否会i在所有实例上增加静态变量?还是只有一个被调用?我以为每个实例都有其自己的副本i,但是逐步执行某些代码似乎并非如此。
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

static不幸的是,关键字在C ++中具有一些不同的不相关含义


当用于数据成员时,这意味着数据是在类中而不是在实例中分配的。


当用于函数内部的数据时,这意味着数据是静态分配的,在第一次进入该块时初始化,并持续到程序退出。此外,该变量仅在函数内部可见。局部静态的这一特殊功能通常用于实现单例的惰性构造。


当在编译单元级别(模块)使用时,这意味着该变量就像一个全局变量(即在main运行之前分配和初始化,并在main退出后销毁),但是在其他编译单元中该变量将不可访问或不可见。


我在每次使用中最重要的部分上加了一些强调。不鼓励使用(3)来支持未命名的名称空间,该名称空间还允许未导出的类声明。


在您的代码中,static关键字的含义为2,与类或实例无关。它是函数的变量,将只有一个副本。


正如iammilind所说,如果该函数是模板函数,则可能存在该变量的多个实例(因为在这种情况下,函数本身确实可以在程序中的许多不同副本中出现)。即使在这种情况下,课程和实例都不相关...请参见以下示例:


#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;

}



查看完整回答
反对 回复 2019-12-12
?
湖上湖

TA贡献2003条经验 获得超2个赞

函数内部的静态变量

  • 在函数内部创建的静态变量存储在程序的静态存储器中而不是堆栈中。

  • 静态变量初始化将在函数的第一次调用时完成。

  • 静态变量将在多个函数调用中保留该值

  • 静态变量的生命周期为Program

//img1.sycdn.imooc.com//5db155a90001a08b08740120.jpg

例子


#include <iostream>


using namespace std;


class CVariableTesting 

{

    public:


    void FuncWithStaticVariable();

    void FuncWithAutoVariable();


};


void CVariableTesting::FuncWithStaticVariable()

{

    static int staticVar;

    cout<<"Variable Value : "<<staticVar<<endl;

    staticVar++;

}

void CVariableTesting::FuncWithAutoVariable()

{

    int autoVar = 0;

    cout<<"Variable Value : "<<autoVar<<endl;

    autoVar++;

}



int main()

{

    CVariableTesting objCVariableTesting;

    cout<<"Static Variable";

    objCVariableTesting.FuncWithStaticVariable();

    objCVariableTesting.FuncWithStaticVariable();

    objCVariableTesting.FuncWithStaticVariable();

    objCVariableTesting.FuncWithStaticVariable();

    objCVariableTesting.FuncWithStaticVariable();


    cout<<endl;

    cout<<"Auto Variable";

    objCVariableTesting.FuncWithAutoVariable();

    objCVariableTesting.FuncWithAutoVariable();

    objCVariableTesting.FuncWithAutoVariable();

    objCVariableTesting.FuncWithAutoVariable();

    objCVariableTesting.FuncWithAutoVariable();


    return 0;

}

输出:


静态变量


变量值:0 

变量值1 

变量值2 

变量值3 

变量值4


自动变数


变量值:0 

变量值:0 

变量值:0 

变量值:0 

变量值:0



查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 391 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信