: {} 안에 아무것도 넣지 않는 것을 영초기화라고 하고,
디폴트값으로 초기화를 진행한다.
0이나 nullptr 이나 0.0f 이나 "" 등등.
: 초기화는그냥 유니폼! 중괄호를 사용하자.
: 생성자 만들때는 암시적 형변환 못하게 explicit을 붙이자.
: 심지어 함수 호출할 때도 {} 묶자.
디버깅 걸어서 확인해보면, 객체 p 라는 어디있는지도 모르는 함수를 호출한 것임..
-> p.Print(); 는 p가 객체가 아니므로 빨간줄 즉, 오류가 발생. // 여기서는 주석처리함.
: {} 중괄호를 이용한 초기화
1) 암시적 형변환을 못하게 함.
2) 모든 타입에 대한 일관적인 형태다.
3) 복사 발생하지 않는 직접 초기화이다.
대입연산은 기본적으로 임기객체(복사)를 만든 후, 초기화하는 것임.
그런데 컴파일러가 최적화를 하는거다.
4) 소괄호와는 다르게 명백히 초기화라는 것을 명시함.
배열, 동적할당, stl 컨테이너, 객체 초기화 등
모든 타입에 대한 초기화가 가능한 초기화 방법.
예시 코드
1) 직접 초기화
: () 소괄호, {} 중괄호를 이용한 초기화
2) 복사 초기화
: 일반적인 대입 초기화를 말함.
3) 1번),{} 직접 초기화 따로 사용, 2번)= 와 {} 직접 초기화를 따로 사용한 경우
: 생성자에서 explicit 설정되어 있을 경우에는 2번)를 이용한 초기화는 불가함.
1) 변수의 타입 / 종류에 따라 초기화 방법이 다름
-> "= 값" , "(값)", "{값}"
2) "암시적 형변환에 따른 데이터 손실"이 발생할 수 있음.
problem
- 직접 초기화
int n(0);
int n{0};- 복사 초기화
int n = 0;
int n = {0};
- 참고로 explicit를 선언한 생성자는 "직접 초기화"만 가능함.
가) 아래의 초기화 코드를 모두 유니폼 초기화로 변경하라.
나) int a 데이터를 대입 초기화로 4.8을 넣어라.
/ int b를 유니폼 초기화로 4.8을 넣어라.
다) Point 클래스의 생성자를 만들고, 객체 생성시 대입해서 생성하자.
이후로, 생성자에 explicit을 작성해보자.
-> 컴파일 오류가 발생할 텐데, 이를 처리하자.
: explicit은 직접 초기화만 가능함.
1) explicit 아닌 경우.
-> 문제 없음.
2) explicit 설정한 경우.
-> 단독으로 사용된 {} 직접 초기화만 가능함.