C++ Principle 9편
9편
enum과 enum class
enum M {
jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
};
enum class Mclass {
jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
};
- enum은 int클래스에 포함되지만 모든 int값이 enum이 되는 것은 아니다.
따라서 M m = 3; enum에 int 대입 불가.
- enum class는 c++11부터 적용되었다.
- enum과 다른점은 enum은 int로 암묵적으로 변환을 허용하고 enum class는 되지 않는다.
- class 가 붙음으로써 변수가 블록 밖에서는 네임스페이스를 가지게 되었다.
int m = jan; // enum int로 쓰이는 게 가능 , namespace 필요없음
int m = Mclass : jan; // enum class int로 암묵적 쓰임 불가능 + namespace 필수
기본 생성자
C++은 생성자를 직접 만들어주지 않은 경우에 기본으로 제공하는 기본 생성자가 있다. 클래스 뒤에 ()를 붙여주면 된다.
특히 문자열과 벡터는 특정한 기본값 초기화를 만들어 놓았다.
// 빈 문자열 ""로 초기화
string s1 = string();
vector<string> n1(); // 요소가 없는 빈 벡터로 초기화
초기화
int a = 1; // 대입
int b = a; // 복사
int c{}; // 0으로 초기화 됨
int c = int() // 0으로 생성
int {}는 {0}처럼 동작하는데 {}에 빈값이면 0으로 초기화되고 string에 {}이면 ““으로 초기화된다.
객체 복사하기
Date dx1 {Year{1998}, Month::jan, 3}; // OK
Date d1{dx1}; // OK
코드리뷰
const Date default_date(1970, 1, 1);
- 바꾸지 않고 계속 쓸 변수로 전역변수로 지정
- 더 나아질 수 있는 코드 .
초안 코드
const Date default_date()
{
return Date(1970,1, 1);
}
- 전역 변수를 쓰지 않고 같은 변수를 여러 번 사용해야 할 때 함수를 사용해서 값을 반환시킬 수 있다.
- const를 사용해 반환함으로써 값을 바꿀 수 없도록 한다.
더 나아진 코드
const Date& default_date()
{
static const Date add{1970, 1, 1};
return dd;
}
- static 지역 변수는 함수를 처음 호출한 시점에서만 초기화(생성)된다. 따라서 단 전역변수를 쓰지 않고도 여러 번 호출해도 단 한 번만 생성되는 변수가 필요할 때 유용하다.
- 또한 여기서 참조를 반환해 불필요한 복사를 없애고, 더 나아가 const 참조를 반환해 호출하는 함수에서 실수로 시간(여기서 참조하는 데이터)을 변경하지 못하도록 한 점에 주목하자.