야시꾸리한 기호 해석하는게 더 좋은가 보다.
typedef 나 using, #define을 잘 써도 읽기가 참 어려운 듯....
원래의 C++ 문법도 좀 복잡하다 싶었는데, C++11을 보니 밀려드는 답답함....
아 ㅅㅂ 좋긴 좋은데, 뭐 이리 복잡하고 난해하지?
이제부턴 for 문을 보게 되면 일반 for 루프인지
아님 범위지정 for 루프인지를 한번 생각해야 하고, (자바에선 이미 하고 있다던가?)
[value](parameter)->return_type { 함수내용 }(parameter);
ㄴ 요렇게 생긴 문장을 보면 이게 lambda 함수 호출인지,
아님 functor 배열 중 하나의 원소 functor를 호출하면서
그 리턴되는 객체에다 멤버 접근 연산자 -> 쓴건지를 유심히 봐야되는구나......
아놔......
아래는 C++11에서 새로생긴 기능들중 일부임
----Lambda 함수
형식:
[母함수의 변수 캡쳐] (파라메터)->리턴타입 {함수내용...}
예 :
int a = 10;
auto Add_n_Cout = [&a] ( int b ){ //람다함수를 이름 붙여서 쓰려면 auto로 만들어야 함
a += b;
cout << a << endl;
};
Add_n_Cout ( 2 );
Add_n_Cout ( 3 );
Add_n_Cout ( 6 );
...
함수객체랑 비슷하게도 쓸 수 있고 바인딩 대신 쓰기에도 좋긴한데,
괄호기호랑 캡쳐기호(=,&) 난무로 인해 가독성 좆망....
눈 크게 뜨고 이게 배열기호인지 람다기호인지 구별해야 함
자바스크립트에서 봤던 function(){...} 이랑 비슷한 것 같은데,
굳이 이렇게 복잡해 보이는 구문으로 만들었어야 했던가....
ps. 나중에 람다함수의 호출규약을 어셈블리 레벨에서 구경해보고 싶음.
---- 형식 추론 decltype(), auto
위키피디아에 나와있는 예로 보면, 생각없이 써도 될 게 아니고, 이놈도 잘 써먹어야 될 듯....
#include
int main()
{
const std::vector
auto a = v[0]; // a has type int
decltype(v[0]) b = 1; // b has type const int&, the return type of
// std::vector
auto c = 0; // c has type int
auto d = c; // d has type int
decltype(c) e; // e has type int, the type of the entity named by c
decltype((c)) f = c; // f has type int&, because (c) is an lvalue
decltype(0) g; // g has type int, because 0 is an rvalue
}
아놔......상황에 따라 판단 잘 해야 되는구나 ㅅㅂ....졸라 복잡하네....
auto는 그냥 대입되는 r-value를 담을 수 있는 l-value 변수만 만드는 것 같고,
decltype() 은 괄호안의 객체를 담을 수 있을만한 객체 형식을 추론하는 거인듯....
근데 sizeof 처럼 typeof() 나 classof() 정도로 좀 더 직관적인 예약어로 해 주면 안되나.....
----R-Value 참조자
참조자 기호 & 대신 && 기호
R-Value를 참조 할 수 있는 모양이고, 기존 객체에
복사생성자 처럼 이동생성자를 만들수 있게 되어서
일반적인 복사대신 더 빠르게 데이터 이동을 가능케 한다고 함.(move sementics)
임시 값이나 고유값에 대한 참조자를 가질 수 있게 한다는건데,
근데 이게 있어야만 move sementics가 되는건지 잘 모르겠다. (포인터로 구현 하면 안되나...)
----std::unique_ptr : 스마트 포인터
auto_ptr 없어지고 unique_ptr 이라는 놈이 새로 생겨서 STL 컨테이너에서 쓸 수 있다길래
복사를 안하고 어떻게 쓰나 했더니, 복사생성자를 아예 막고, R-Value Ref 가지고 move 생성자를
도입한 듯...(컨테이너에 넣고 객체 이동은 가능하지만, 객체 복사를 시도하면 컴파일 오류 발생)
STL컨테이너에 넣을 땐 std::move() 로 넣어줘야 됨 (명시적으로 데이터 이동임을 표시)
---- std::array
vector 보다 빠르지만 사이즈가 고정되어 있는 새로운 배열 컨테이너
---- std::unordered_set / std::unordered_multiset /std::unordered_map /std::unordered_multimap
해쉬테이블을 사용하는 새로운 set/map 컨테이너. (기존의 set / map은 R-B Tree)
원소가 많아지면 R-B Tree보다 빠르지만 정렬되지는 않는 컨테이너
---- 함수 반환값 후행선언 : 함수 선언문 뒤에 ->기호로 반환 형식 지정
auto GetIterator(파라메터)->std::vector
{ ...함수내용... }
이런식으로 반환형을 뒤에 적어준다는거 같은데, 가독성을 좋게하는 효과가 있는지 어떤지는 모르겠고,
객체 포인터에 멤버 접근 연산자랑 기호 중복됨...짜증남....
이거 잘못보면 무슨 객체포인터 쓰는거랑 헷갈리는거 아닐까....
---- 템플릿에 typedef 쓰는것 같은 효과 주는 using 키워드:
template
using Text = std::map
아놔.......그냥 typedef로 하는게 보기 좋은것 같은데....using이라니.....
아직 vs2010에선 안되는 듯.....
---- 가변인자 템플릿
template
struct count
static const int value = 1 + count
}
template<> // 재귀의 끝
struct count<> { static const int value = 0;}
이렇게 선언해 놓고
count
이런 멤버를 얻으려고 하면 count
이런식으로 같은 객체의 다른버전들이 계속 인스턴스화 되면서 value를 1씩 증가 시킨다.
요상한 재귀형 객체......신기하네....
---- 객체에 final 과 override등의 명시적 지시자 추가
final 지시자가 붙은 객체는 상속 불가
final 지시자가 붙은 멤버 함수는 오버라이딩 불가 함수로 지정
override 상속받은 객체에 있는 멤버를 오버라이드 한 것임을 명시함.(베이스 객체에 그 멤버가 없으면 컴파일 오류)
이건 좋은거 같음.
---- 객체 초기화 할 때 중괄호 사용
std::vector
요런게 가능하다는건데, VS2010에선 안됨