✅코딩규칙 : 모든 초기화는 uniform으로 - 영초기화 검색하자.

보물창고·2022년 8월 9일
0

c++ basic 코드누리

목록 보기
4/50
  • 코드누리 강의를 보고 복습, 공부정리한 내용임.
  • 용어 설명 : uniform : 일관된 이란 뜻을 가짐.

240729 추가

: {} 안에 아무것도 넣지 않는 것을 영초기화라고 하고,
디폴트값으로 초기화를 진행한다.
0이나 nullptr 이나 0.0f 이나 "" 등등.

결론

: 초기화는그냥 유니폼! 중괄호를 사용하자.
: 생성자 만들때는 암시적 형변환 못하게 explicit을 붙이자.
: 심지어 함수 호출할 때도 {} 묶자.

추가 240604

  • struct에서 정의되지 않는 생성자에 접근할 때,
    : 아래 그림과 같이 소괄호 초기화로는 초기화 불가함.
    중괄호 초기화의 경우, 암시적 형변환 하는 initializer list를 통해 변환이 가능하다.

  • 출력까지 완료

객체 생성 에서의 {} vs () 차이점.

  • () 초기화의 경우, 일단 함수인지 객체 선언인지 구분을 못함.
    디버깅 걸어서 확인해보면, 객체 p 라는 어디있는지도 모르는 함수를 호출한 것임..
    -> p.Print(); 는 p가 객체가 아니므로, 빨간줄 발생. // 여기서는 주석처리함.

개념

: {} 중괄호를 이용한 초기화

  • 직접 초기화 중의 하나임.
    소괄호 초기화는 암시적 형변환을 하지만,
    중괄호 초기화는 암시적 형변환을 차단함.

유니폼 초기화를 해야 하는 이유

1) 암시적 형변환을 못하게 함.
2) 모든 타입에 대한 일관적인 형태로 초기화가 가능함
3) 대입연산은 기본적으로 임기객체(복사)를 만든 후, 초기화하는 것임.

  • 차이점 : 다른 초기화는 변수의 타입 종류에 따라서 초기화하는 방법이 다름
    - 중괄호는 유저타입이나, 배열의 경우,
    - 대입은 어떤 타입이든지 가능함.
    => 언제 어떨대 , 대입을 사용하고, () 을 사용해야만 하는거지? 헷갈림

특징

  • 배열, 동적할당, stl 컨테이너, 객체 초기화 등
    모든 타입에 대한 초기화가 가능한 초기화 방법.

  • 예시 코드

초기화를 하는 방법.

1) 직접 초기화
: () 소괄호, {} 중괄호를 이용한 초기화

2) 복사 초기화
: 일반적인 대입 초기화를 말함.

  • 대입과 {} 중괄호 가 함께 쓰여도 복사임!
    -> int data = 10 ; // int data = {0};

3) 1번),{} 직접 초기화 따로 사용, 2번)= 와 {} 직접 초기화를 따로 사용한 경우
: 생성자에서 explicit 설정되어 있을 경우에는 2번)를 이용한 초기화는 불가함.

기존 초기화의 문제점

1) 변수의 타입 / 종류에 따라 초기화 방법이 다름
-> "= 값" , "(값)", "{값}"
2) "암시적 형변환에 따른 데이터 손실"이 발생할 수 있음.

함수의 인자로 "유니폼 초기화" 가능함.

  • problem

    • 유니폼 초기화 없이 함수 호출
      -> 경고만 나오고, 빌드 성공함..
    • 유니폼 초기화를 이용한 함수 호출
      -> 오류 발생함.
    • 이런식으로 하면 안됨!
      -> 이니셜라이저 리스트 를 사용하는 것임.
      : 즉 중괄호 안에 콤마를 통해 배열을 나타내는 경우, 이는 암시적으로
      initialize_list를 생성하는 것이다.

초기화의 2가지 형태

  1. 직접 초기화
    int n(0);
    int n{0};
  2. 복사 초기화
    int n = 0;
    int n = {0};
  • 참고로 explicit를 선언한 생성자는 "직접 초기화"만 가능함.

problem

가) 아래의 초기화 코드를 모두 유니폼 초기화로 변경하라.

나) int a 데이터를 대입 초기화로 4.8을 넣어라.
/ int b를 유니폼 초기화로 4.8을 넣어라.

다) Point 클래스의 생성자를 만들고, 객체 생성시 대입해서 생성하자.
이후로, 생성자에 explicit을 작성해보자.
-> 컴파일 오류가 발생할 텐데, 이를 처리하자.

  • explicit

    : explicit은 직접 초기화만 가능함.

1) explicit 아닌 경우.

-> 문제 없음.

2) explicit 설정한 경우.

-> 단독으로 사용된 {} 직접 초기화만 가능함.

profile
🔥🔥🔥

0개의 댓글