development

멤버 함수의 정적 변수

big-blog 2020. 6. 14. 09:41
반응형

멤버 함수의 정적 변수


누군가 C ++에서 멤버 함수의 정적 변수가 어떻게 작동하는지 설명해 줄 수 있습니까?

다음과 같은 클래스가 주어집니다.

class A {
   void foo() {
      static int i;
      i++;
   }
}

의 여러 인스턴스를 선언하면 한 인스턴스를 A호출 foo()하면 i모든 인스턴스 에서 정적 변수가 증가 합니까? 아니면 그 중 하나만 호출 되었습니까?

각 인스턴스에는 자체 사본이 있다고 가정 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 ++에서 관련이없는 몇 가지 의미가 있습니다.

  1. 데이터 멤버에 사용되는 경우 데이터가 인스턴스가 아니라 클래스에 할당 됨을 의미 합니다.

  2. 함수 내부의 데이터에 사용되는 경우 데이터가 정적으로 할당 되고 블록을 처음 입력 할 때 초기화 되고 프로그램이 종료 될 때까지 지속됨을 의미합니다. 또한 변수는 함수 내에서만 볼 수 있습니다. 로컬 스태틱의이 특별한 기능은 종종 싱글 톤의 게으른 구성을 구현하는 데 사용됩니다.

  3. 컴파일 단위 레벨 (모듈)에서 사용될 때 변수는 전역 변수와 유사하지만 (즉, 종료 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;
}

함수 내부의 정적 변수

  • 정적 변수는 함수 내부에 생성되며 스택이 아닌 프로그램의 정적 메모리에 저장됩니다.

  • 정적 변수 초기화는 함수의 첫 번째 호출에서 수행됩니다.

  • 정적 변수는 여러 함수 호출에서 값을 유지합니다

  • 정적 변수의 수명은 프로그램입니다

enter image description here

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

출력 :

정적 변수

Variable Value : 0
Variable Value : 1
Variable Value : 2
Variable Value : 3
Variable Value : 4

Auto Variable

Variable Value : 0
Variable Value : 0
Variable Value : 0
Variable Value : 0
Variable Value : 0


Simplified answer:

Static variables, regardless whether they are members of a (non-templated) class or a (non-templated) function, behave - technically - like a global label which scope is limited to the class or function.

참고URL : https://stackoverflow.com/questions/6223355/static-variables-in-member-functions

반응형