C++에는 변수를 초기화하는 세가지 기본적인 방법이 있다.
1 | int var = 7; | cs |
첫번째로 복사 초기화(copy initialization)가 있다.
복사 초기화는 위 코드처럼 대입연산자( = )를 사용하고
1 | int var = 7.34; | cs |
위 코드처럼 int 변수에 double 값을 대입하는 등 암시적인 형변환을 일부 허용한다. (단 위 코드같은 경우는 소수자리는 짤리고 정수자리까지만 적용됨)
그렇기에 편의를 챙길 수도 있긴 하지만 암시적인 형변환에 따른 위험도 함께 존재한다.
1 | int var(7); | cs |
두번째로 직접 초기화(direct initialization)가 있다.
직접 초기화는 위 코드 처럼 괄호 ()를 사용하고 복사초기화와 마찬가지로 암시적인 형변환을 일부 허용한다. (마찬가지로 int 변수에 double 대입시 소수자리는 짤림)
또한 일부 데이터 타입에서 복사 초기화보다 뛰어난 성능을 보이기도 하고 주로 초기화와 할당을 구분하기위해서도 쓰인다.
1 | int var{ 7 }; | cs |
세번째로 유니폼 초기화(uniform initialization)가 있다.
앞서 소개한 두가지 초기화는 일부 타입의 변수에 대해서만 작동하지만 C++ 11에 들어와서 모든 데이터 타입에서 작동하는 단일 초기화 메커니즘을 제공하기 위해 추가된 초기화이다.
유니폼 초기화는 중괄호{}를 사용하고
1 | int var{}; | cs |
빈 중괄호로 변수를 초기화하면 기본 초기화(default initialization)가 되고
1 | int var{ 7.4 }; | cs |
앞선 두가지 초기화와 다르게 암시적인 형 변환을 허용하지 않아서 위 코드처럼 데이터타입에 맞지 않은 값을 넣게되면 에러가 발생하게된다.