2013-05-23 2 views
2

두 가지 버전의 C++ 코드가 있습니다. 하나는 문제를주고 다른 하나는하지 않습니다const 멤버 및 기본 생성자와의 오류

/* 
* This compiles fine 
*/ 
class base { 
    private: 
     const char c; 
    }; 

int main() { 
    base b(); // compiles fine 
} 

/* *이 차이는 '기본 B()'와 '베이스 (B)'는 컴파일 오류를 */

class base { 
    private: 
     const char c; 
    }; 

int main() { 
    base b; // error: structure 'b' with uninitialized const members 

} 

참고를 제공합니다. 둘 다 기본 생성자를 호출하고 클래스에 const 필드가 있기 때문에 프로그램이 컴파일되지 않습니다. 설명해주세요. 사실,

base b; // Declares an object b of type base 
base b(); // Declares a FUNCTION called b that takes no argument an returns a base 

: 첫 번째 버전 유형 base의 객체를 생성하지 않기 때문이다

+0

가능한 복제본 [const 데이터 멤버가 포함 된 클래스에 기본 생성자가없는 이유] (http://stackoverflow.com/questions/16706674/why-default-constructor-is-not-present-for- a-class-containing-const-data-members) – juanchopanza

+0

당신은 C++의 "가장 귀찮은 구문 분석"의 또 다른 희생자입니다 (당신은 구글도 할 수 있습니다) :'base b();'는 ** 변수 정의로 해석되지 않습니다 ** 컴파일러에 의해서가 아니라'int f();'또는'void g();'과 같은 _function 선언과 같은 것이다. (어림짐작 : 컴파일러가 함수 선언으로 해석 할 수있는 모든 것은 _will_입니다.) –

답변

3

아니라 는 인수를 취하지 않는다 입력 base의 개체를 반환 b라는 함수 선언 ,

int main() { 
    base b(); // DECLARES function b() 
    b(); // INVOKES function b() 
} 

base b() // DEFINITION of function b() 
{ 
    base c; 
    // ... 
    return c; 
} 

지금 main() 더 이상 당신 문제를 제공하지 않습니다 기능 : 당신이 정말로 경우가 있는지 확인하려면 다음을 시도 할 수 그러나 b() 함수 안에 base c; 함수가됩니다. 원래 예제의 base b;과 정확히 같습니다. 왜?

일반적으로 유형이 const 인 데이터 멤버는 자격 증명 유형의 데이터 멤버와 마찬가지로 개체를 구성하자 마자 초기화되어야합니다. 이를 일반적으로 보장하는 방법은 constructor's initialization list에서 데이터 멤버를 초기화하는 것입니다.

이, 예를 들어, 컴파일 :

class base { 
public: 
    base() : c('x') { } 
private: 
    const char c; 
}; 

int main() { 
    base b; 
} 
+0

감사합니다. Andy. 너는 그것을 잘 설명했다. – ArvindDotiyal

+0

@ user2414310 : 도움이 되셨습니다. :)이 질문에 대한 답변이 있으면 답변을 수락 한 것으로 표시하거나 다른 사용자가 선호하는 다른 답변을 표시하십시오. –

1

const를 숯불 C; 선언시 정의해야합니다. const char c = 'a'; 예를 들어