문제

이것은 작동합니다 :

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

그러나 이것은 컴파일러 오류를 제공합니다 ( "할당되지 않은 로컬 변수 'a'") : :

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

내가 말할 수있는 한, 첫 번째 예에서 기술적으로 컴파일러는 'A'가 할당되지 않았다는 것을 알지 못하기 때문에 발생합니다. 후자의 예에서 'A'는 로컬로 정의되므로 추적하기 쉽습니다.

그러나 후자의 예는 왜 작동하지 않습니까?

기본값을 0으로 정수하지 않습니까? 이것은 컴파일러가 "모범 사례"를 위해 시행하는 것입니다. 아니면 또 다른 이유가 있습니까?

도움이 되었습니까?

해결책

첫 번째 예에서는 a입니다 필드. 필드는 자동으로 0/false/null로 기본적으로 기본적으로 기본적으로 기본적으로 기본적으로 기본적입니다. 두 번째 예에서는 a입니다 변하기 쉬운. 변수입니다 ~ 아니다 기본적으로 사용하기 전에 "명확한 할당"이 있어야합니다.

본질적으로, 객체를 만들거나 구조물을 초기화 할 때 메모리 (또는 비 디폴트 구조물 CTOR의 경우 모든 것을 수동으로 초기화해야 함)를 0으로 만들어냅니다. 그러나 변수는 매우 일반적이기 때문에 (모든 방법에서) 스택을 항상 0으로 만드는 오버 헤드를 원하지 않습니다. 대신 초기 값을 표시하도록 강요합니다.

다른 팁

기본값을 0으로 정수하지 않습니까?

클래스의 데이터 구성원이지만 로컬 변수 일 때는 아닙니다. 로컬 변수는 사용하기 전에 명시 적으로 초기화되어야하므로 컴파일러 오류가 발생합니다.

클래스의 새 인스턴스를 인스턴스화하면 객체가 필요한 모든 메모리가 "제로로드"int가 0으로 설정되어 있습니다. 스트링이 널로 설정됩니다. 이것은 C에서 가능한 이상한 메모리 버그와 해킹을 피하는 것입니다. (++). 불행히도 이것은 또한 처리 비용이 적기 때문에 로컬 변수를 만들 때 언어는 곧 값을 직접 설정하고 필요한 지침의 총 수를 줄이기 위해 값을 제로화하지 않는다고 가정합니다. UNSET 메모리를 사용할 위험을 상쇄하기 위해 컴파일러 검사를 도입하여 변수를 사용할 수 있도록 값이 설정되었는지 확인합니다.

클래스 레벨에서 선언 된 변수는 동일한 범위에서 값을 할당 할 수 없기 때문일 수 있습니다 (선언 할 때를 제외하고).

예를 들어

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

반면

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}

내 지식에 따라 클래스에서 변수를 선언하고 객체를 만들 때 기본 생성자는 변수를 초기화하므로 클래스 변수를 초기화 할 필요가 없습니다. 그러나 클래스에서 메소드에 오면 해당 변수를 초기화 할 생성자 나 아무것도 없어서 메소드에서 초기화되지 않은 변수를 할당 할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top