logo

C++의 정적 키워드

전제 조건: C의 정적 변수

자바 문자열 추가

static 키워드는 다른 유형과 함께 사용될 때 다른 의미를 갖습니다. 다음과 함께 정적 키워드를 사용할 수 있습니다.



    정적 변수: 함수의 변수, 클래스의 변수 클래스의 정적 멤버: 클래스 객체 및 클래스의 함수 이제 static의 각 용도를 자세히 살펴보겠습니다.

정적 변수

함수의 정적 변수 : 변수가 static으로 선언되면 다음을 위한 공간이 있습니다. 프로그램 수명 동안 할당됩니다. . 함수가 여러 번 호출되더라도 정적 변수를 위한 공간은 한 번만 할당되며 이전 호출의 변수 값은 다음 함수 호출을 통해 전달됩니다. 이는 C/C++ 또는 이전 함수 상태를 저장해야 하는 다른 애플리케이션에서 코루틴을 구현하는 데 유용합니다.

C++








// C++ program to demonstrate> // the use of static Static> // variables in a Function> #include> #include> using> namespace> std;> void> demo()> {> >// static variable> >static> int> count = 0;> >cout << count <<>' '>;> >// value is updated and> >// will be carried to next> >// function calls> >count++;> }> int> main()> {> >for> (>int> i = 0; i <5; i++)> >demo();> >return> 0;> }>

>

>

산출

0 1 2 3 4>

위 프로그램에서 변수 개수가 정적으로 선언된 것을 볼 수 있습니다. 따라서 해당 값은 함수 호출을 통해 전달됩니다. 함수가 호출될 때마다 변수 개수가 초기화되지 않습니다. 참고로 Java는 함수에서 정적 지역 변수를 허용하지 않습니다.

클래스의 정적 변수 : static으로 선언된 변수는 별도의 static 저장소에 공간을 할당받아 한 번만 초기화되므로 static 변수는 클래스의 객체는 공유됩니다. 서로 다른 개체에 대해 동일한 정적 변수의 복사본이 여러 개 있을 수 없습니다. 또한 이러한 이유로 정적 변수는 생성자를 사용하여 초기화할 수 없습니다.

C++




// C++ program to demonstrate static> // variables inside a class> #include> using> namespace> std;> class> GfG {> public>:> >static> int> i;> >GfG(){> >// Do nothing> >};> };> int> main()> {> >GfG obj1;> >GfG obj2;> >obj1.i = 2;> >obj2.i = 3;> >// prints value of i> >cout << obj1.i <<>' '> << obj2.i;> }>

>

>

산출

undefined reference to `GfG::i' collect2: error: ld returned 1 exit status>

위 프로그램에서 여러 개체에 대해 정적 변수 i의 여러 복사본을 만들려고 시도한 것을 볼 수 있습니다. 하지만 이런 일은 일어나지 않았습니다. 따라서 클래스 내부의 정적 변수는 아래와 같이 클래스 외부에서 클래스 이름 및 범위 확인 연산자를 사용하여 사용자가 명시적으로 초기화해야 합니다.

C++




// C++ program to demonstrate static> // variables inside a class> #include> using> namespace> std;> class> GfG {> public>:> >static> int> i;> >GfG(){> >// Do nothing> >};> };> int> GfG::i = 1;> int> main()> {> >GfG obj;> >// prints value of i> >cout << obj.i;> }>

>

이진 검색 트리에서 삭제

>

산출

1>

클래스의 정적 멤버

정적 클래스 객체 : 변수와 ​​마찬가지로 객체도 정적으로 선언되면 프로그램 수명까지 범위를 갖습니다. 객체가 비정적인 아래 프로그램을 고려해보세요.

C++


프롤로그 언어



// CPP program to illustrate> // when not using static keyword> #include> using> namespace> std;> class> GfG {> >int> i;> public>:> >GfG()> >{> >i = 0;> >cout <<>'Inside Constructor '>;> >}> >~GfG() { cout <<>'Inside Destructor '>; }> };> int> main()> {> >int> x = 0;> >if> (x == 0) {> >GfG obj;> >}> >cout <<>'End of main '>;> }>

>

>

산출

Inside Constructor Inside Destructor End of main>

위 프로그램에서 객체는 if 블록 내에서 비정적으로 선언되었습니다. 따라서 변수의 범위는 if 블록 내부에만 있습니다. 따라서 객체가 생성되면 생성자가 호출되고 if 블록의 제어가 소멸자를 넘어서자마자 객체의 범위가 선언된 if 블록 내부에만 있으므로 소멸자가 호출됩니다. 이제 객체를 정적으로 선언하면 출력이 어떻게 변하는지 살펴보겠습니다.

C++




// CPP program to illustrate> // class objects as static> #include> using> namespace> std;> class> GfG {> >int> i = 0;> public>:> >GfG()> >{> >i = 0;> >cout <<>'Inside Constructor '>;> >}> >~GfG() { cout <<>'Inside Destructor '>; }> };> int> main()> {> >int> x = 0;> >if> (x == 0) {> >static> GfG obj;> >}> >cout <<>'End of main '>;> }>

>

>

산출

Inside Constructor End of main Inside Destructor>

출력의 변화를 명확하게 볼 수 있습니다. 이제 메인이 끝난 후에 소멸자가 호출됩니다. 이는 정적 객체의 범위가 프로그램 수명 전체에 걸쳐 있기 때문에 발생했습니다.

클래스의 정적 함수 : 클래스 내부의 정적 데이터 멤버나 정적 변수와 마찬가지로 정적 멤버 함수도 클래스 개체에 의존하지 않습니다. 객체와 '.' 연산자를 사용하여 정적 멤버 함수를 호출하는 것이 허용되지만 클래스 이름과 범위 결정 연산자를 사용하여 정적 멤버를 호출하는 것이 좋습니다. 정적 멤버 함수는 정적 데이터 멤버 또는 기타 정적 멤버 함수에만 액세스할 수 있습니다. , 비정적 데이터 멤버나 클래스의 멤버 함수에 액세스할 수 없습니다.

C++




// C++ program to demonstrate static> // member function in a class> #include> using> namespace> std;> class> GfG {> public>:> >// static member function> >static> void> printMsg() { cout <<>'Welcome to GfG!'>; }> };> // main function> int> main()> {> >// invoking a static member function> >GfG::printMsg();> }>

멍청한 평균
>

>

산출

Welcome to GfG!>

관련 기사:

  • 정적 키워드에 대한 퀴즈
  • C++의 정적 데이터 멤버
  • 정적 객체는 언제 파괴되나요?
  • 정적 멤버 함수에 대한 흥미로운 사실
  • 정적 함수가 가상일 수 있나요?
  • C++와 Java의 정적 키워드 비교
  • C의 정적 함수