1. auto : 데이터 형을 자동으로 추론
- 컴파일 동안 데이터 형이 결정이 된다.
- 따라서, 반드시 auto 변수를 초기화해야한다.
- Javascript의 동적으로 자료형이 바뀌는 것과는 다르다.
포인터 받을 때 : auto 또는 auto* (확실히 구분하는 것이 좋다. 모호한 상황에서 가독성이 좋지 않기 때문)
참조를 받을 때 : auto& (&가 없으면 컴파일러가 구분을 못하기 때문에 당연하게 &를 붙여야 한다)
const 참조를 받을 때는 const auto&를 사용하자(이 것도 가독성이 안좋아진다.)
auto는 타이핑을 줄여주는 대신 가독성을 떨어트린다. => 몇 개를 제외하고 auto보다 실제 자료형을 선호한다.
auto를 사용하는 경우
for (std::vector<int>::const_iterator it=v.begin();it!=v.end();++it) {...}
-> for (auto it=v.begin();it!=v.end();++it){...}
for (std::map<std::string,std::string>::const_iterator it = v.begin();it!=v.end();++it){...}
-> for (auto it=v.begin();it!=v.end();++it){...}
일부 템플릿형의 경우에도
MyArray<int>* a = new MyArray<int>(10);
auto* a = new MyArray<int>(10);
런타임 성능은 동일하다
2. static_assert : assert는 많이 사용하는 것이 유용하다.
assert는 디버그 중 문제를 잡기 위해 조건이 맞는지 확인하여 틀리면 멈추는 키워드
static_assert는 컴파일중 문제를 잡는다 assert는 실행 도중에만 잡을 수 있는 단점이 있었는데 그것을 해결
assert의 사용 방법
assert(조건); //조건이 false면 실행 멈춤
static_assert사용 방법
static_assert(조건,내용);
사용 예시 1 : 구조체 크기 확인
사용 예시 2 : 버전 확인
사용 예시 3 : 배열의 길이 확인
최대한 static_assert를 사용하자, 하지만 컴파일러가 모르는 것이면 assert를 사용하자
assert는 디버그중에(프로그램 실행 중) 문제를 포착(오직, 디버그 빌드)하지만, static_assert는 컴파일 중 포착함
3. default/delete
ex) Dog() = default; -> 컴파일러가 대신 기본 생성자를 만들어준다.(가독성을 위해)
C++11전 복사생성자를 막기위해서는 복사생성자를 private에 선언한다.
C++11이후
ex) Dog(const Dog& other)=delete; //컴파일러가 자동으로 생성자를 만들어 주길 원치 않는다면 delete사용
4. final/override
final : 클래스 상속 막기
ex) class Animal final {...}
함수 상속 막기
ex) virtual void Set(float w) final;
=> 클래스나 가상 함수를 파생 클래스에서 오버라이딩 못하도록 하는 final 키워드 (컴파일 도중 확인)
-> 가상 함수가 아니면 사용 불가능
오버라이드를 하는 경우 오버라이드를 하는데 잘못된게 없는가를 확인하기 위해 override 키워드를 사용
-> 잘못된 가상 함수 오버라이딩을 막기 위해 사용(가상 함수만 사용 가능, 컴파일 도중 검사)
offsetof 매크로
멤버들의 상대적 위치 구하기
#define offsetof(type,member) 로 매크로 구현이 되어있다.
직렬화, 역직렬화를 할 경우 유용하다.
특정 멤버가 본인을 포함한 자료 구조의 시작점에서 몇 바이트 떨어져있는지 알려준다.
'C++' 카테고리의 다른 글
C++ STL (0) | 2021.12.27 |
---|---|
C++ 새로운 자료형 (0) | 2021.12.26 |
C++ STL 알고리듬 (0) | 2021.12.22 |
C++ 탬플릿 프로그래밍 (0) | 2021.12.22 |
C++ 15일차 (0) | 2021.07.01 |