목차
1. Auto
2. range based for
3. enum class
4. non-static data member initializers
5. initializer lists
6. default / delete definition
7. override / final
8. emplacement
9. constexpr
10. lambda
11. random
12. thread
이번 글에서는 [4-5편] non-static data member initializers 와 initializer lists
를 함께 다루도록 하겠습니다.
4, 5편 내용은 짧기 때문에 두 편을 한 글로 붙였습니다.
4. Non-static data member initializers
- C#, Java 처럼 멤버 변수 정의와 동시에 초기 값을 할당 할 수 있다.
대체 이것이 무슨 말?? 이냐 하면
역시나 코드로 바로 보도록 하자.
Class TEST | |
{ | |
public: | |
void print() | |
{ | |
std::cout << n1 << ", " << s1 << std::endl; | |
} | |
private: | |
int n1 = 100; | |
std::string s1 = "test"; | |
}; |
위에서 private: 아래의 멤버 변수를 살펴보면
선언과 동시에 초기화가 진행 되는 것을 볼 수 있다.
옛날엔 이거 안됐다!!
근데 지금은 된다 ㅡ, . ㅡ;
학창 시절 Java를 배웠을 때는 당연히 되던거라 게임 프로그래밍으로 넘어오면서 C++을 할 때 이게 안됐던 시기엔
어 = _=..왜안되지...원래안되나...하고 넘어갔었으나
C++11로 넘어오면서 가능해진 것으로 알고 있다.
즉 헤더에서도 멤버 변수 선언과 동시에 초기화가 가능하다!
여기까지는 다들 "뭐...음..그래...그래서...? 당연하거 아닌가?" 하고 넘어 갈 수 있다.
다시 먼저 코드를 보도록 하자.
class TEST | |
{ | |
public: | |
void print() | |
{ | |
std::cout << n1 << ", " << s1 << std::endl; | |
} | |
//private: | |
int n1; | |
std::string s1; | |
}; | |
TEST test { 1, "test" }; | |
test.print(); |
살펴보면 private이 주석 처리 되어
멤버변수들이 접근한정자 public: 으로 바뀌게 되었고
외부에서 TEST test { 1 , "test" }; 로 초기화가 가능해졌다!
이 말인즉 public 접근이 가능한 클래스 멤버 변수가 외부에서 초기화가 바로 가능하다 라는 점이다.
이걸 잘 응용해본다면 외부 다른 클래스에서도 해당 클래스의 new로 선언함과 초기화를 바로 진행이 가능하게 만들 수 있다는 것!
그 외에도 기본적인 타입들에 대해서 initializer를 쓸 수 있다.
std::string str1 { "hello world" }; | |
std::string str2 = { "hello world" }; | |
std::string str3 { }; | |
std::string str4 = { }; | |
std::pair<int, int> p1 { 10, 20 }; | |
std::pair<int, int> p2 = { 10, 20 }; |
5. initializer lists
- 초기화 리스트 전용 type
- 함수의 인자, 유저 정의형, STL 컨테이너의 초기화에 사용할 수 있다.
template <class T> | |
class vector{ | |
public: | |
vector(std::initializer_list<T>); | |
}; | |
std::vector<int> v { 1, 2, 3 }; |
일반적인 배열 초기화
int sum ( initializer_list<int> li ) | |
{ | |
return accumulate(li.begin(), li.end(), 0); | |
} | |
auto result = sum ({ 9, 8, 7, 6 )}; |
(오오...auto 슨상님이 등장했다)
결론. 멤버 이니셜라이즈를 통해 초기화 구문을 쉽게 정의 할 수 있다!
'Programming > C++' 카테고리의 다른 글
[7편] Modern C++정리: override / final (0) | 2017.03.23 |
---|---|
[6편] Modern C++정리: dafault / delete definition (0) | 2017.03.22 |
[3편] Modern C++정리: enum class (0) | 2017.03.22 |
[2편] Modern C++정리: range based for (0) | 2017.03.22 |
[1편] Modern C++정리: auto (0) | 2017.03.22 |