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 |