답변:
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
m_
i의 상태를 나타내는 등의 접 두부를 추가 할 수 있습니다 .
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;
}
keyword static unfortunately has a few different unrelated meanings in C++
: +
함수 내부의 정적 변수
정적 변수는 함수 내부에 생성되며 스택이 아닌 프로그램의 정적 메모리에 저장됩니다.
정적 변수 초기화는 함수의 첫 번째 호출에서 수행됩니다.
정적 변수는 여러 함수 호출에서 값을 유지합니다
정적 변수의 수명은 프로그램입니다
예
#include <iostream>
using namespace std;
class CVariableTesting
{
public:
void FuncWithStaticVariable();
void FuncWithAutoVariable();
};
void CVariableTesting::FuncWithStaticVariable()
{
static int staticVar = 0; //staticVar is initialised by 0 the first time
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
간단한 답변 :
정적 변수는 (템플릿 class
되지 않은) 함수 또는 (템플릿되지 않은) 함수의 멤버인지 여부에 관계없이 기술적으로는 범위가 class
또는 기능으로 제한되는 전역 레이블처럼 동작 합니다.
MyClass& instance(){ static MyClass x("config.ini"); return x; }
단일 스레드 사용을위한 유효한 이식 가능한 구현은 로컬 정적이 말에도 불구하고 단순히 전역과 같지 않기 때문에 정확합니다.
static int i
, 인스턴스에 특정을 그 예를 들어 그렇게o1.foo(); // i = 1
하고$o2.foo(); // i = 1
...?