프로그래밍/C++

#61. 중괄호 초기화 { }

코딩하는상후니 2022. 7. 22. 22:23

 


 

*중괄호 초기화 {  }
 
int a = 0;
int b(0);
int c{ 0 };

Knight k1;
Knight k2 = k1;

Knight k3{ k1 };
 
 
 
*어떤 '장점' 이 있는가 ??
 
1. 컨테이너 초기화에 잘 어울림.
 
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);

int arr[] = { 1,2,3,4 };
vector<int> v2{ 1,2,3 };
 
2. 축소 변환 방지
=> 변수의 데이터 손실에 대한 에러를 발생시킴.
int x = 0;
double y(x);
double z{ x };
 
'축소 변환' 은 가능한 값의 일부를 저장하지 못할 수도 있는 데이터 형식으로 값을 변경합니다.
예를 들어 소수 값은 정수 계열 형식으로 변환될 때 반올림되고 로 변환되는 숫자 형식은 또는 로 Boolean True False 줄어듭니다.
 
 
int -> float 변환은 완벽하게 이루어지지도 않고애당초 float는 일종의 근사치를 개념하는 것.
int의 범위는 –2,147,483,648 ~ 2,147,483,647
float의 범위는 -3.4×10^38 ~ 3.4×10^38
 
 
 
3. 기본 생성자 생성 시,

 

Knight k4 { };
Knight k4( );  => 클래스 선언(생성자호출) 이 아니라, 함수 선언이 되어버림.
=> 이런 상황정도를 방지할 수 있다 정도.

 

 


*어떤 '단점' 이 있는가 ??
 
Knight(int a, int b)
{
cout << "int int !!" << endl;
}
 
Knight(initializer_list<int> li)
=> 해당 생성자가 ( 최상위포식자 ) 가 되어버림.
{
cout << "initializer list !!" << endl;
}
 
Knight k5{ 1,2,3,4,5 };
 
=> 만약
Knight k2{1, 2} 일 때, ( int a, int b ) 생성자가 아니라,
initializer_list 생성자가 호출되어져버림.
 
 
 
*stl 을 사용할 때도 이런식의 혼동이 있을 수 있음.
vector<int> v1{1, 2} 시,  데이터 1개에 2를 넣어라 이지만,
실제로 1, 2 데이터가 들어가 있음.

 


 

본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.

 

 

 

 

 

 

 

 

'프로그래밍 > C++' 카테고리의 다른 글

#63. nullptr  (0) 2022.07.22
#62. auto  (0) 2022.07.22
#60. Algorithm  (0) 2022.07.21
#59. set & multimap & multiset  (0) 2022.07.21
#58. Map  (0) 2022.07.21