C++ 11에 추가 된것들
뭔가 손에 익숙한것들만 쓰다 보니 안쓰게 되서 여기에 다시 정리하는겸 해서 써봄
1. auto
변수타입이 컴파일 할때 결정됨 이거 뭔가 웹언어나 golang 비슷해짐.
auto stringVar = "Linsoo"; auto intVar = 190; auto floatVar = 1.99; auto pfloatVar = &floatVar; std::cout << stringVar <<"\n"; std::cout << intVar << "\n"; std::cout << floatVar << "\n"; std::cout << *pfloatVar << "\n"; //결과 Linsoo 190 1.99 1.99
2. 람다(lambda)
이름 없는 함수 golang 책 보다가 알게됬는데 C++ 11에서도 똑같은거 있고 다른언어에서도 나오는거 보니 뭐랄까 언어 통틀어 공통적으로 많이 쓰이는거 같음. 근데 난 익숙치 않아서 (장점도 모르겠고) 잘 안씀
[캡쳐](함수 인자 정의){함수 구현}
캡쳐부분은 람다함수 내부에서 외부의 변수를 사용할 수 있게 지정해줌.
특정 변수를 넣으면 그것만 쓸수 있고 &를 넣으면 외부의 모든 변수를 사용할 수 있음.
auto intVar = 190; auto func = [intVar](int n) { std::cout << intVar + n << "\n"; }; func(200); auto func2 = [&](int n) { std::cout << intVar + n << "\n"; }; func2(500); //결과 390 690
3. nullptr
NULL == 0 이 아닌 레알 NULL 포인터
void func(int n) { std::cout <<"func1"<<"\n"; } void func(int *n) { std::cout << "func2"<<"\n"; } int main() { func(0); func(NULL); func(static_cast<int*>(0)); func(nullptr); int *a1 = nullptr; int *a2 = 0; int *a3 = NULL; if (a1 == a2 && a1 == a3) { std::cout << "모두 같음" << "\n"; } return 0; } //결과 func1 func1 func2 func2 모두 같음
기존 0이나 NULL은 변수 인자로 들어갈때 정수형으로 인식해서 들어가지만 nullptr은 포인터 형으로 인식해서 들어감. 하지만 if은 전부 0이나 NULL이나 nullptr이나 같은걸로 인식함.
앞으론 함수 호출 리턴값으로 에러시 0이나 NULL값 리턴하는거 보다 nullptr를 넘기는게 좋다고 생각함.
4. tuple
2개 이상의 데이터값을 하나로 묶을수 있다.
golang에서도 봤던건데 종전까진 함수 리턴값이 한개만 리턴할 수 있어서 여러개 받아야 하는 경우면 인자값 넣을때 포인터로 넣어서 내부에서 직접 쓰게 하던지 하는 식으로 했어야 했는데
이제는 그냥 이걸로 묶어서 던지면 된다.
#include <tuple> std::tuple<int, float> func(int n ) { return std::make_tuple(n, n + 0.5f); } int main(){ std::tuple<int, int, std::string> testTuple; testTuple = std::make_tuple(3, 5, "linsoo"); std::cout << std::get<0>(testTuple)<<"\n"; std::cout << std::get<1>(testTuple) << "\n"; std::cout << std::get<2>(testTuple).c_str() << "\n"; auto re = func(5); std::cout << std::get<0>(re) << "\n"; std::cout << std::get<1>(re) << "\n"; return 0; } //결과 3 5 linsoo 5 5.5
한가지 맘에 좀 덜 맘에 든다고 해야 하나 golang은 그냥 함수 리턴할때 리턴 변수를 여러개를 직접입력해서 쓰기 편한데 C++ 튜플은 뭔가 이런저런 쓸게 더 많다는거 정도랄까나
func(int n ) { return (n, n + 0.5f); } a, b = func(5); a = 5 b = 5.5
만약 golang이라면 이런식으로 쓰기도 보기도 좋게 나옴 ㅎㅎㅎ
5. Thread
OS 상관없이 쓰레드를 쓸수 있다 이전에는 winapi에서 지원하는 쓰레드를 쓰던지 boost 라이브러리를 써야 했는데 이젠 그냥 간단하게 쓸수가 있다 거기다가 이전 winapi에서 지원하던 쓰레드는 글로벌 함수를 돌릴수 있었는데 (클래스 static도 된다고 하는거 같은데 직접 써본적은 없다)
C++ 11에서는 클래스 멤버함수도 쓰레드로 돌릴수 있다.
#include <thread> class test { public: int m_iCount; bool m_bTerminate; test():m_bTerminate(false), m_iCount(0){ } void func() { while (m_bTerminate == false) { m_iCount++; _sleep(100); } } }; int main(){ test tt; std::thread t([&] {tt.func(); }); std::thread m([&]() { while (true){ _sleep(100); if (tt.m_iCount > 100){ tt.m_bTerminate = true; break; } std::cout << tt.m_iCount << "\n"; } }); t.join(); m.join(); return 0; }
쓰레드 t는 test의 멤버 함수를 멀티쓰레딩으로 돌려주고 쓰레드 m은 test의 객체를 화면에 출력한다. static이 아닌 클래스의 멤버함수를 쓰레드로 돌릴려면 람다함수를 써야 함.
그나마 자주 쓰는것만 정리했는데 나머진 좀 더 찾아보고 써보고 정리해야지.
답글 남기기