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 참조를 반환해 호출하는 함수에서 실수로 시간(여기서 참조하는 데이터)을 변경하지 못하도록 한 점에 주목하자.





© 2017. by yunsu

Powered by dolphin