2017-01-23 6 views
0

저는 C++ 프로그래밍과 프로그래밍 그 자체가 비교적 새로운데 C++ 코드의 Visual Studio 컴파일러에서 예상되는 동작에 익숙해 지려고했습니다. (비주얼 스튜디오 2015) 로컬 변수 객체에 대한 Visual Studio C++ 컴파일러 이상한 동작

class aClass { 

    public: 
    int a; 
    int b; 
} 

그런 기능 블록 내부 I이 클래스의 객체를 선언 할 때

aClass obj; 
cout << obj.a; 

다음 I 그대로 한번에 변수 값 랜덤 RAM 콘텐츠를 얻을 다른 때는 컴파일 오류가 발생하지만 로컬 변수는 초기화되지 않습니다. (컴파일러 번 오류를 극복 할 때마다 그것이 오류를 극복 처음 전에 여러 번 계속 반복 할 수 있지만, 특히, 그것은, 다시 반복하지!)

선언 객체의 모범 사례에 대한 조언,

일관된 결과를 얻으려면 양식 aClass obj = aClass();을 사용해야합니다.

또는 관련성이있는 의견. 미리 감사드립니다.

+0

클래스에 멤버 변수를 초기화하는 생성자가 누락되었습니다. –

+0

런타임에 수명이있는 변수는 기본적으로 초기화되지 않습니다. – George

+0

_while 다른 번에 컴파일 오류가 발생합니다. 로컬 변수가 초기화되지 않았습니다. 올바르게 기억하면 오류가 아니라 경고입니다. –

답변

5

클래스 또는 구조체에서 변수를 선언하면 개체가 생성되지만 내부의 데이터는 자동으로 초기화되지 않습니다. 데이터를 초기화하는 것은 당신에게 달려 있습니다. 초기화없이 멤버 변수의

값은 불확정하고 (심지어 그들로부터 읽기) 어떤 방법을 사용하는 것입니다 것은 정의되지 않은 동작입니다.

클래스 또는 구조에 따라 데이터를 초기화하는 방법이 다릅니다. 생성자를 정의한 경우에는 생성자 초기화 목록을 사용하는 것이 좋습니다. 당신이 (당신이 당신의 코드에서 보여주는 것과 같은)는 POD 형 구조를 가지고 있다면 당신은 단순히 어떻게 정의되지 않은 동작을 호출에 대한 하지,

aClass obj = {}; // Basically the same as `aClass obj = aClass()` 
+0

답을 주셔서 감사합니다. 클래스 내에서 기본 constuctor를 명시 적으로 선언하는 방법에 감사드립니다. 선언 된 모든 개체는 자동 생성자에서 자동으로 생성되지 않으므로 내 질문에 대한 이유가됩니다. 그것은 어리석은 질문이 아니 었습니다. 오히려 기본 생성자는 컴파일러가 제공 할 때와 달리 제공 할 때 다르게 동작하는 것 같습니다. 그리고 평소와 같이 서두르는 사람은 누구나 질문의 ​​자세에 대한 "충분한 인식 부족"에 대한 응답을 암시하는 잘못된 대답을 되돌려줍니다. 이 대답을 포함해서는 안됩니다. 감사합니다 – Physician

+0

@Physician 작은 설명 : 생성자를 정의한 후 그 자체만으로는 멤버 변수를 초기화 할 수 없습니다. 멤버 변수를 초기화하는 생성자가 없으면 명시 적으로 초기화해야합니다). –

+0

그래, 나는 그것을 가치있는 조언으로 받아 들일 것이다. 틀림없이. 그러나 실제로 클래스 유형에 명시적인 기본 생성자가 있으면 명시 적 초기화없이 문자 만 ("type identifier;)"으로 작성하면 절대로 컴파일러가 객체를 "초기화하지 않은"것으로 간주하지 않습니다. – Physician

1

Any advice on best practice of declaring objects

예처럼 뭔가를 할 수 있습니까? 초기화되지 않은 변수를 읽는 중입니다. 때로는 컴파일러가 그것을 감지하고 언젠가는 그렇지 않으므로 쓰레기가 나오게됩니다.

어떻게 처리합니까? 변수를 읽기 전에 변수를 초기화하십시오!