✅코딩 규칙 : default vs value 초기화

보물창고·2023년 1월 26일
0
  • 업데이트 240318

value 초기화, 영초기화라고도 함. 240802

: 인자를 넣지 않고, 중괄호를 이용한 초기화를 말함.
-> 컴파일러가 0으로 초기화를 함.

  • 예외
    : 클래스에서 유저타입 생성자가 있다면, 쓰레기 값으로 초기화를 함.

예시
int n1; // 디폴트 초기화 -> 이때는 쓰레기 값임.
int n2{}; // value 초기화 -> 0으로 초기화.

그러나 int n3(); 과 같은 경우는 함수 선언이기 때문에 에러 발생.

  • 아래의 코드를 빌드하면 역시,n3은 선언으로 처리되어서 링크에러 발생한다.
    -> 왜냐하면 operator()(); 함수 연산자로 인식하기 때문이다.

default vs value 초기화 차이.

원형 타입.

  • 변수를 선언만 한 상태
    : default initialization
    -> 쓰레기값으로 설정됨.

  • 중괄호를 작성한 상태
    : value initialization
    -> 0으로 초기화 됨.

  • 예시 코드
    : cl 컴파일러는 지역변수 초기화하지 않았따는 오류를 발생시킴.

-> 실행하면 그냥 터짐...

객체 를 통한 value 초기화 , 디폴트 초기화

  • 객체를 대입 , () 초기화 , {} 초기화 했을 때 확인해보자.

  • 객체에다가 () 초기화의 경우, 객체 생성이 아니고, 함수를 호출하는 것으로 받아들인다.

  • 호출 함수에러 발생한 부분을 지우고, 이렇게 하니까. p3생성자 호출도 아니다.
    컴파일러가 받아들이기에 생성자 호출도 아니고, Point 함수가 있는 건가? 라고 생각하기만 한다.
    : p1과 p2의 객체 생성자만 호출됨.

핵심. : 다시 돌아와서. 위의 설명은 다른길로 샜다..

-> 그런데 핵심은 객체에 대해서 value 초기화를 했지만, p1과 p2의
멤버들은 0으로 초기화되지 않았다. (p3 객체의 생성자가 호출되는지 확인하기 위해 기본 생성자 따로 만들어 확인한 거임...)

  • 이유는
    : 유저 타입 기본 생성자를 만들었기 때문이고, 유저 타입 생성자를 지우고 다시 실행해보자.

  • p2 객체의 멤버는 0으로 초기화된 것을 확인할 수 있다.

  • c++ 11에서의 defalut 키워드를 작성하면 컴파일러에게 기본 생성자
    제작을 위임하므로, 이 때는 생성자가 없는 코드와 동일한 동작이 이루어짐.

profile
🔥🔥🔥

0개의 댓글