C++ (85) 썸네일형 리스트형 [C++] 람다 람다는 함수 객체를 빠르게 만드는 문법이다. 람다는 [](매개변수){함수 본체} 의 형식으로 이루어져있다. 반환타입이 없는데 auto와 같이 자동으로 반환타입을 추론한다. [](매개변수)->반환타입{함수본체}의 형식으로 반환타입을 정할 수도 있다. auto LambObj = [=](Item& item){return Item.id==itemId}; //클로져 위와 같이 람다로 만든 객체를 클로져라고 한다. 그런데 본체 부분에서 itemId는 어디서 불러오는 것일까? 함수 객체에서는 변수를 만들어 저장하지만 람다에서는 다른 곳에 있는 변수를 가져와 저장할 수 있다. 가져오는 방식에 따라 복사면 []괄호안에 =, 참조면 &을 쓴다. 이것을 캡쳐 모드라고 한다. 그래서 위 예제에서 복사를 사용하면 람다 생성 시.. [C++] 오른값 참조(rvalue reference) int a = 3; 에서 a는 왼값(lvalue), 3은 오른값(rvalue)이다. 왼값이란 단일 식을 넘어 계속 지속되는 개체이고 오른값이란 왼값이 아닌 나머지이다. (임시 값, 열거형, 람다, i++ 등) 다음은 참조 방법에 대해 알아보자. void Copy_RValueRef(Player&& player){} 오른값 참조를 사용할 때는 &을 연속해서 두개 붙인다. 그러면 rvalue을 참조할 것이며 rvalue는 우리 마음대로 수정이 가능하고 lvalue처럼 지속되지도 않는다. 그래서 위 코드에서 매개변수로 받은 rvalue player을 nullptr로 설정할 수 있다. 이런 특성 때문에 복사가 아니라 이동이 가능해진다. void operator=(Player&& player) { //깊은 복사 /.. [C++] 사용하지 않는 함수 삭제하기 Modern C++이전에는 암시적으로 실행되는 클래스의 복사 생성자 등을 막기 위해 private을 사용했다. class A { private: operator= (const A& a); //대입 연산자 private으로 막기 friend class B; } class B { public: void CopyA(const A& a) { A a1; a1 = a; } } 위 코드에서 A 클래스의 대입 연산자를 private 선언하고 구현부를 선언하지 않음으로써 막았다. 그래서 오류가 나야 정상이지만 B 클래스를 friend class로 선언하니 오류가 발생하지 않는 문제가 발생한다. public: operator= (const A& a) = delete; delete를 이용하면 컴파일 전에 바로 오류가 발생한.. [C++] enum vs enum class 기존 enum은 unscoped, 범위가 없다. 그 의미는 내가 PlayerType enum에 Knight를 사용했다면, MonsterType 에서는 Knight를 사용할 수 없다. 하지만 enum class는 scoped, 범위가 있고 범위는 enum class 안으로 제한된다. 그래서 PlayerType, MonsterType 두 enum class에 모두 Knight를사용할 수 있다. 그런데 enum class는 또 하나, 암묵적인 변환이 불가능하다. double value = KNIGHT; // enum 암시적 변환 허용 double value = static_cast(PlayerType::Knight); //명시적 변환만이 허용되며 앞에 enum class::을 표기해야 함 //그 이유는 enu.. [C++] typedef보다 using을 사용하자. Modern C++의 using은 typedef의 완벽한 상위호환인데, 왜 그런지 살펴보자. typedef void(*MyFunc)(); using MyFunc = Void(*)(); 우선 가독성이 좋다. 위는 매개변수를 받지 않고 void형의 함수 포인터를 선언한 것인데, typedef는 함수타입 사이에 함수명이 껴서 굉장히 불편하다. 하지만 using은 함수명과 타입을 완전히 분리시켜 보기 편하다. 이것은 제쳐두고라도 using을 사용하기 좋은 상황은 템플릿을 사용할 때이다. template struct Vector { typedef std::vector type; } template using Vector = std::vector; typedef는 템플릿을 지원하지 않기 때문에 위처럼 구조체를 만들.. [C++] NULL은 int고 nullptr은 포인터다. 아무것도 없다는 것을 표현하고 싶을 때 NULL과 nullptr 두 방식으로 표현할 수 있다. 두 방식의 큰 차이점은 NULL은 0과 같기 때문에 int이고 nullptr은 포인터이다. 그래서 포인터가 아무것도 가리키지 않다는 것을 표현할 때는 NULL이 아니라 nullptr이 적합하다. Test(NULL); //Test(int) 생성자 실행 TEST(nullptr)//Test(void*) 생성자 실행 nullptr의 작동원리는 *연산자를 오버로딩해 0을 반환하는 것이다. 그래서 결론적으로 nullptr도 0을 반환하지만 *가 붙어있는 포인터를 대상으로만 작동한다. [C++] auto auto는 C++11에서 생긴 편리한 문법인데, 변수 선언시에 따로 데이터 타입 설정 없이 auto라고만 하면 초기화 하는 값에 따라 알아서 타입을 맞춰준다. auto a1 = 3; //int auto a2 = 2.3f; //float auto a3 = 2.3; // double; auto a4 = Knight(); //Knight; auto a5 = "ASDF"; //const char* auto에 *을 붙일 시 초기화 값이 포인터일 경우에만 작동한다. auto* p1 = "ABCD"; //const char* auto* i1 = 3; // (x) 주의해야 할점은 auto는 const, &를 무시한다는 것이다. int& ref = a; const int cst = a; auto b1 = ref;//in.. [C++] algorithm 헤더의 remove, remove_if 주의점 map의 remove 함수와 달리 algorithm 헤더의 remove,remove_if는 완전히 데이터를 지우지 않는다. 따지자면 데이터를 지우는 것이 아닌 조건에 맞지 않는 데이터만 남긴다는 느낌이다. 게다가 데이터를 남기고 나머지 데이터는 지우는 것이 아니라 그대로 남긴다. 그래서 데이터를 목적에 맞게 제거하기 위해 erase와 연계한다. Vector v; v.push_back(1); v.push_back(4); v.push_back(3); v.push_back(5); v.push_back(8); v.push_back(2); std::remove_if(v.begin(),v.end(),IsOdd()); 위와 같이 벡터에 데이터를 집어 넣고 IsOdd라는 함수객체에 따라 데이터를 제거한다고 하자. 원래.. 이전 1 2 3 4 5 ··· 11 다음