C++11부터를 Modern C++로 분류한다.

 

[auto]

 

auto, template 같은 타입 추론을 형식 연역(type deduction) 이라고 한다.

 

주의사항으로 기본 auto는 const, reference를 무시하므로 명시적으로 붙여주어야만 한다.

int a = 3;
int& ref = a;
auto = ref // int&가 아닌 int형으로 잡힌다

 

일반적인 상황에서는 가독성을 위해 기존 타입을 사용하는게 나을수도 있다.

다만, 타입이 너무 긴 경우 (컨테이너의 pair, iterator 등)

 

[중괄호 초기화]

 

vector 등 컨테이너와 잘 어울린다.

축소 변환을 방지한다.

int x = 0;
double y = x; // y(x) 둘다 허용

double y{x}; // 컴파일 에러!

 

객체를 중괄호 초기화로 생성자를 불러오는 경우, initializer_list 생성자를 만들어주어야 한다.

class Knight
{
public:
	Knight(initializer_list<int> li)
    {
    	// do something
    }
};

 단, 이니셜라이저 리스트 생성자가 존재하면 중괄호 초기화 시 무조건 이니셜라이저 리스트 생성자만 호출이 된다.

 

괄호 초기화

- 전통적인 C++ (거부감이 없음)

- vector 등 특이 케이스에 대해서만 {} 사용

 

중괄호 초기화

- 초기화 문법의 일치화

- 축소 변환 방지

 

[nullptr]

 

오동작을 방지한다.

가독성이 좋아진다.

 

[using]

 

typedef을 대체할 수 있는 문법

typedef int id;
using id2 = int; // typedef과 순서가 반대

 

직관성이 좋아진다.

typedef void (*MyFunc)();
using MyFunc2 = void(*)();

 

typedef은 템플릿을 활용할 수 없지만 using은 가능하다.

 

[enum class]

 

scoped enum

 

이름공간 관리에 이점이 있고 암묵적인 변환이 금지된다.

 

enum Player { NONE, .. };
enum Monster { NONE, .. }; // 재정의 오류

기존 enum은 범위가 전역이기 때문에 중복된 이름을 사용할 수 없다.

 

enum class ObjectType1 { PLAYER, .. };
enum class ObejctType2 { PLAYER, .. };

ObjectType1::PLAYER;
ObjectType2::PLAYER;

enum class는 이름 공간으로 잡히기 때문에 중복된 이름 사용이 가능하다.

 

기존 enum은 암시적인 형변환이 가능했지만 enum class는 오로지 같은 enum class 타입끼리만 연산이 가능해진다.

장점이 될 수도 있고 단점이 될 수도 있다.

 

enum class ObjectType { PLAYER, MONSTER };

int t1 = ObjectType::PLAYER; // 컴파일 에러
int t2 = static_cast<int>(ObjectType::PLAYER); // 형 변환을 해야만 가능

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

[Modern C++] 오른값 참조 (rvalue reference)  (0) 2022.08.31
[Modern C++] #2  (0) 2022.08.31
[STL] algorithm  (0) 2022.08.31
[STL] set, multimap, multiset  (0) 2022.08.31
[STL] map  (0) 2022.08.31

+ Recent posts