알다시피, 클래스 구조 내에서 정수 const 정적 멤버를 초기화 할 수 있습니다. 이것은 클래스 구조에서 상수가 클래스 구조에서 사용될 때 유용합니다. 예를 들어 int 배열의 크기로 사용할 수 있습니다.클래스 내에서 초기화되는 const 정적 멤버를 정의해야하는 이유
class MyClass{
static const int num = 100;
int elems[num];
...
};
을하지만 우리는 여전히 클래스 정의 외부에 멤버 NUM을 정의 할 수 있습니다 : 다음 코드를 봐
const int MyClass::num;
우리가 같이해야 할 이유를 모르겠어요. 누군가 내게 이유를 말해 줄 수 있습니까? 고마워요. 비주얼 스튜디오 2008에서 잘
#include <iostream>
using namespace std;
class MyClass{
public:
MyClass()
{
cout << "instruct class MyClass!" << endl;
}
static const int num = 100;
int elems[num];
};
//const int MyClass::num;
int main()
{
MyClass a;
const int *b = &(a.num);
cout << "&(a.num): " << &(a.num) << endl;
cout << "a.num: " << a.num << endl;
cout << "*b: " << *b << endl;
}
그것은 실행 :
은 또한, 나는 다음과 같은 코드를 작성
하지만 코드를 제거했는지 명확한 회원 NUM 수업 외부.
나는 매우 혼란 스럽다. 누군가 나를 위해 그것을 해석 할 수 있습니까?
그러나 컴파일러는 템플릿의 정적 멤버 또는 인라인 함수를 처리하는 것과 동일한 방식으로 처리 할 수 있습니다. 둘 다 정의는 여러 파일이지만 하나의 주소가 필요합니다. –
@JamesKanze : 템플릿의 정적 멤버의 경우 암시 적 인스턴스 생성이이 작업을 수행하지 않으므로 실제로는 성가신 정의가 필요합니다. 인라인 함수에서 정적 변수처럼 동작하도록 만들 수 있습니다. 필자가 알고있는 점은 링크 시간에 버려지는 약한 기호로 함수를 작성함으로써 이러한 작업이 가능하다는 것입니다. 그러나 컴파일러는 현재 언어가 존재한다고 주장하지는 않지만 정의를 요구합니다. –
알아. 기술적으로, 정의를 요구하지 않는 것은 문제가되지 않을 것이라고 말하는 것입니다. 컴파일러 기술을 필요로하지 않는 것을 지원하는 것이 다른 상황에서도 필요하기 때문입니다. –