본문 바로가기
Script/Modern C++

[Modern C++] Chapter 02. 중괄호 초기화 { }

by song.ift 2023. 5. 22.

GitHub : https://github.com/developeSHG/Modern-C/blob/a30dc0a22e2afcdb8ae81e9ca9e3f46fb125ab66/Modern%20C%2B%2B/Modern%20C%2B%2B/reset.cpp

 

GitHub - developeSHG/Modern-C: Modern C++

Modern C++. Contribute to developeSHG/Modern-C development by creating an account on GitHub.

github.com

 

 


 

 

#include <iostream>

using namespace std;

// 주제 : 중괄호 초기화 { }

class Knight
{
public:

};

int main()
{
	// 중괄호 초기화 { }
    int a = 0;
    int b(0);
    int c{ 0 };
    
    Knight k1;
    Knight k2 = k1; // 복사 생성자 (대입 연산자가 아니다)
    
    Knight k3; // 기본 생성자
    k3 = k1; // 대입 연산자
    
    Knight k4{ k2 };
    
    // 초기화하는 문법이 제각각이다.
    
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    
    // 기존 방식 초기화
    vector<int> v2(10, 1); size를 10개를 만들고, 1로 초기화.
    int arr[] = { 1, 2, 3, 4 };
    
    // C++11 이후 (새로운 방식의 초기화)
    
    // 중괄호 초기화 장점
    // 1) vector 등 container와 잘 어울린다.
    vector<int> v3{ 1, 2, 3, 4 };
    
    // 2) 축소 변환 방지
    int x = 0;
    double y(x); // 타입이 달라서 데이터가 완전히 호환이 되지 않아 데이터가 간접적으로 손실이 되겠지만 컴파일 시, 별다른 문제없이 통과한다.    
    double y{ x }; // 굉장히 깐깐하게 동작해서 축소 변환을 허용하지 않아 에러를 뱉어낸다. (방지차원에서 효과적임)
    
    // 3) Bonus
    Knight k4(); // 기본 생성자 호출이 아닌 완전히 다른 방식인 그저 함수 호출 방식이다.
    Knight k4{ }; // 온전히 기본 생성자 방식으로 만들어진다.
    
    
    // 괄호 초기화 ()을 기본으로 한다
    // - 전통적인 C++ (거부감이 없음)
    // - vector 등 특이한 케이스에 대해서만 { } 사용
    
    // 중괄호 초기화 { }를 기본으로 간다.
    // - 초기화 문법의 일치화
    // - 축소 변환 방지

	return 0;
}

'Script > Modern C++' 카테고리의 다른 글

[Modern C++] Chapter 06. delete  (0) 2023.05.22
[Modern C++] Chapter 05. enum class  (0) 2023.05.22
[Modern C++] Chapter 04. using  (0) 2023.05.22
[Modern C++] Chapter 03. nullptr  (0) 2023.05.22
[Modern C++] Chapter 01. auto  (0) 2023.05.22

댓글