2017-12-26 37 views
1

코드 스 니펫 here을 읽었습니다. "Const 클래스 데이터 멤버"를 검색하여 섹션으로 이동하십시오. 코드는 아래와 같습니다.const 멤버를 C ​​++ construtor로 초기화 할 수 있습니까?

VS2013을 사용하면 올바르지 않다고 경고합니다. 아시다시피 const 멤버 변수는 초기화 목록으로 만 초기화 할 수 있습니다. Sth. 같은 :

Test (int x):i(x){} 

는 (? 그렇다면, 변화가, 우측에는 차이가 보인다 함수 본문에 초기화, 합리적인 소리) 그것을 지원하는 새로운 C++ 표준 업데이 트를 했습니까? 또는 문서가 실수를 범합니다 (나는 실수하지 않을 것이라고 추정합니다).

+1

첫 번째 코드 단편은 C++ 표준에서 올바르지 않습니다. – DeiDei

+3

예. 초기화 할 수 있습니다. 그러나 당신은 그것을 초기화하지 않습니다. 당신은 그것에 할당하고 있습니다. – StoryTeller

+0

자습서를 계속 진행해야합니다. 생성자 이니셜 라이저 목록은 나중에 설명합니다. http://www.studytonight.com/cpp/initializer-list-in-cpp.php –

답변

2

규칙이 변경되지 않았습니다 (C++ 98에서).

생성자 본문의 내부에있는 i=x;은 초기화가 아니라 할당 임에 유의하십시오. 그들은 다른 것들입니다. const 회원을 위해, 그들은 그러한 참조 및 const를 수식 유형의 구성원으로서 기본적으로 초기화 할 수 없습니다 회원에 대한 initialized,

는, 멤버 이니셜 라이저를 지정해야 할 수 있습니다.

Test (int x):i(x){},

하지만이 할당 할 수 없습니다,

Test (int x) 
{ 
    i=x; // assignment is not allowed 
    ... 
    i=42; // assignment again; that makes no sense for const at all 
} 
0

예, const 회원 전용 (초기화 목록을 사용하여) 초기화하고 코드에 도시 ​​된 바와 같이, 할당 할 수는 없습니다. 아니요, 최신 C++ 표준에서는 생성자에서 할당을 지원하도록이 표준을 업데이트하지 않았습니다.

코드 스 니펫이 포함 된 문제의 튜토리얼이 잘못되었습니다. 나는 자습서를 읽는 것에 대해 조언하기를 권고한다. 자습서는 미묘한 (그리고 그렇게 미묘하지 않은) 오류가없는 것보다 더 자주한다.

+0

@EdHeal 주말에 프로그램하고 싶습니다. 노래는 단지 파트 타임 일뿐입니다. –