2013-01-03 2 views
2

C++ FAQ를 읽습니다.C++에서 변수를 선언 할 수있는 곳은 어디입니까?

"는 const를 정적 데이터 멤버는 클래스에 선언 일반적 입니다 같은 .cpp 파일로, 소스 파일에 정의 (초기화) 그러나 된다. 제 16 장에서, 정적을 사용하여 그것을 말한다 어떤 경우에는 클래스 본체에서 초기화 될 수 있습니다. "

그런 다음 계속해서 정수 및 비 정수 유형을 선언 할 수 있습니다 (이 내용은 C++ 11에서 정수로 변경된 것으로 생각되지만).

내 질문에 위의 내용은 const 정적 데이터 멤버에만 적용되며 non-const 정적 데이터 멤버에는 적용되지 않습니까?

나는 정말로 혼란스러워지기 시작하고 왜 이러한 제한이 있는지 보지 못하고 있습니까? 휘발성, 변경 가능 및 기타 키워드 변수에 대한 규칙이 있습니까? 누군가 이것을 어떻게 쉽게 배울 수 있습니까 (24 시간 프로그래밍하는 것 외에)?

+1

C++ 03에서는 static, const, integral 형식 인 경우에만 클래스에 있습니다. – chris

+0

자세히 알아 보려면 설명서를주의 깊게 읽어야합니다 *. 사물이 정의되는 방법에는 종종 많은 미묘한 차이가 있지만 주어진 예제를 따르면 그것이 어떻게 작동하는지 일반적으로 이해해야합니다. C++에 대한 모든 것을 효과적으로 알 필요는 없습니다. – tadman

답변

3

변수를 선언하면 C++ 2011에서 아무 것도 변경되지 않았습니다! 그러나 은 클래스 정의 본문의 모든 멤버 변수을 초기화 할 수 있습니다. 객체를 생성 할 때 클래스 정의에 선언 된 값은 기본적으로 사용되는 값입니다. 멤버 이니셜 라이저 목록에 멤버가 언급되어 있으면 이니셜 라이저 목록이 우선 순위를 갖습니다.

일반적으로 정적 데이터 멤버를 정의해야합니다. 그러나 staticconst 멤버는 클래스 본문에서 선언 및 초기화를 수행하지 않을 수 있습니다. 멤버가 참조 또는 해당 주소로 바인딩되지 않은 경우에는 선언으로 충분하므로 정의를 제공 할 필요가 없습니다. 그러나 주소를 가져 가면 여전히 정의해야합니다. 여기

는 회원 초기화에 대한 기본값이 설정 될 수있는 방법의 몇 가지 예입니다 :

class foo 
{ 
private: 
    int i{5}; 
    int j = 6; 
    std::vector<int> v{ 1, 2, 3, 4 }; 
    std::vector<int> w = std::vector<int>(2, 10); 
    std::vector<int> z = decltype(z)(2, 10); 

    // ... 
}; 

주, 괄호를 사용하여 작동하지 않습니다. 따라서 위의 마지막 두 양식 중 하나를 사용해야 할 수도 있습니다.

+0

클래스의 인스턴스가 생성되기 전에 값이 "도달 가능"하므로 AND를 동시에 정의하고 초기화하는 것이 좋습니다. – user997112

+0

또한 "클래스 정의의 본문"이란 헤더 파일에있는 사양을 의미합니까? – user997112

+0

@ user997112 : 초기화는 멤버의 차례가 될 때 수행됩니다. ... 그리고 나는 클래스 정의가 * 클래스 정의라고 확신한다. 클래스의 이름, 기본 클래스, 멤버 등을 지정합니다. –

1

일반적인 추론은 저장 장치가 필요한 경우 원본 파일에 정의해야한다는 것입니다. 정적 const 정수라면 저장소가 필요하지 않습니다. 컴파일러는 변수를 사용하는 모든 곳에서 리터럴 정수를 대체 할 수 있습니다. 비 정적 인 경우 각 개체에 저장소가 필요한 멤버 변수입니다. 그것이 const가 아닌 경우 업데이트 될 때 값을 유지할 수있는 장소가 필요합니다.

+0

변수가 const인지 여부는 관련이 없습니까? – user997112

+0

@ user997112 예, const 일지 여부는 중요합니다. 내가 분명하지 않다면 미안해,하지만 내 대답은 그런 것 같아. –

+0

아아, 알겠습니다. 정적 const 값이 분명히 변경 될 예정이므로 컴파일 할 때 값이 다양하므로 선언 공백이 다릅니다. – user997112

관련 문제