Nice programing

const 멤버가 본문이 아닌 생성자 이니셜 라이저에서 초기화되어야하는 이유는 무엇입니까?

nicepro 2020. 11. 21. 09:17
반응형

const 멤버가 본문이 아닌 생성자 이니셜 라이저에서 초기화되어야하는 이유는 무엇입니까?


const생성자 본문이 아닌 생성자 이니셜 라이저 목록에서 초기화 된 것으로 선언 된 클래스 멤버가 필요한 이유는 무엇 입니까?

둘의 차이점은 무엇입니까?


C ++에서 개체는 실행이 생성자의 본문에 들어갈 때 완전히 초기화 된 것으로 간주됩니다.

당신은 말했다 :

"왜 const가 본문이 아닌 생성자 이니셜 라이저 목록에서 초기화되어야하는지 알고 싶었습니다."

누락 된 것은 초기화 목록에서 초기화 가 발생 하고 생성자 본문에서 할당이 발생한다는 것입니다. 논리의 단계 :

1) const 객체는 초기화 만 가능합니다.

2) 개체에는 초기화 목록에서 초기화 된 모든 구성원이 있습니다. 명시 적으로 초기화하지 않더라도 컴파일러는 기꺼이 그렇게 할 것입니다 :-)

3) 따라서 1)과 2)를 합치면 const 인 멤버는 초기화 목록에서 발생하는 초기화시에만 할당 된 값을 가질 수 있습니다.


const 참조 변수는 선언 된 줄에서 초기화되어야합니다.

 class Something  
 {  
     private:  
      const int m_nValue;  
     public:  
      Something()  
      {  
          m_nValue = 5;  
      }  
  };

다음과 같은 코드를 생성합니다.

const int nValue; // error, const vars must be assigned values immediately  
nValue = 5; 

생성자의 본문에 const 또는 참조 멤버 변수 값을 할당하는 것만으로는 충분하지 않습니다.

C ++는 멤버 변수를 나중에 생성하지 않고 생성 할 때 초기화 할 수있는 멤버 변수를 초기화하는 또 다른 방법을 제공합니다. 이것은 초기화 목록을 사용하여 수행됩니다.

두 가지 방법으로 변수에 값을 할당 할 수 있습니다. 명시 적 및 암시 적 : 일반 복사를 클립 보드로보기?

int nValue = 5; // explicit assignment  
double dValue(4.7); // implicit assignment  

초기화 목록을 사용하는 것은 암시 적 할당을 수행하는 것과 매우 유사합니다.

기본 및 멤버 데이터 개체를 초기화하는 데 사용되는 멤버 초기화 목록은 생성자의 선언이 아니라 정의에 있습니다.

cpp-tutorialCode Wrangler 에 대해 자세히 알아보십시오 .


상수 변수와 참조는 선언 할 때 즉 사용하기 전에 초기화해야하기 때문입니다. 그러나 생성자는 변수를 초기화하지 않고 변수에 값을 할당하므로 상수 및 참조에 대해 초기화 목록을 사용해야합니다.

참고 URL : https://stackoverflow.com/questions/355258/why-must-const-members-be-initialized-in-the-constructor-initializer-rather-than

반응형