본문 바로가기

반응형

C++11

(9)
[C++] 람다와 함수 포인터 들어가며 이전 포스트(람다(lambda) 표현식)에서는 람다 표현식을 auto 변수에 담아 마치 함수 포인터인터인것 처럼 사용했었다. auto f1 = [](int a, int b) { return a + b; }; std::cout 함수 포인터 우리는 앞서 람다 표현식은 '이름 없는 함수 객체'라고 배웠다. 그런데 어떻게 객체가 함수 포인터에 저장 될 수 있는 것일까? 이유는 컴파일러에 의해 생성되는 함수자 클래스 내부에서 함수 포인터로 암시적 형변환을 지원하고 있기 때문이다. 컴파일러가 만드는 클래스에 '함수 포인터로 변환 될 수 있는 변환 연산자 함수 제공' // int (*f)(int, int) = [](int a, int b) { return a + b; }; class __CompilerGen..
[C++] 람다(lambda) 표현식 #3 들어가며 이번 포스트에서는 람다의 다양한 로컬 변수 캡처 방법에 대해 살펴 볼 것이다. C++ 람다에 대한 추가 정보는 이전 포스트 [C++] 람다(lambda) 표현식 #1 [C++] 람다(lambda) 표현식 #2 들을 참고 하도록 하자. 디폴트 캡처 디폴트 캡쳐는 모든 지역 변수에 대해 일괄 캡쳐를 진행할 수 있는 캡쳐 연산자다. 기본적인 람다 인트로듀서(대괄호로 표현된 람다 제일 시작 부분)에 캡쳐 리스트를 적는 대신 '=' 또는 '&'를 적는다. 기호 동작 [=] 모든 지역 변수를 capture by value [&] 모든 지역 변수를 capture by reference int v1 = 10, v2 = 20; auto f1 = [=]() {}; // 모든 로컬 변수를 값으로 캡쳐 auto f2..
[C++] 람다(lambda) 표현식 #2 들어가며 이전 포스트([C++] 람다(lambda) 표현식 #1)에서는 람다 표현식의 기본적인 내용을 살펴 보았다. 이번 포스트는 이전 포스트에 이어 람다 표현식에 대해 좀 더 자세히 다뤄 보도록 하겠다. 람다 = 임시 객체? C++에서 람다의 정의를 보면 다음과 같다. "an unnamed function object" capable of capturing variables in scope. 이전 포스트에서도 이야기 했듯이 람다는 이름 없는 함수 객체의 일종이다. 정확히 번역하자면 '범위 안에 있는 변수를 캡쳐 할 수 있는 이름 없는 객체'를 람다라고 한다. 이게 무슨 이야기인지 설명하기 위에 이전 포스트의 예제를 상기해보자. int main() { std::vector v = { 1, 3, 2, 5,..
[C++] 람다(lambda) 표현식 #1 들어가며 이번 포스트에서는 C++11 부터 추가된 람다 표현식에 대해 살펴 보도록하겠다. 람다 표현식(lambda expression)이란 '익명의 함수를 만드는 문법'으로써 정확하게는 익명의 함수 객체를 만드는 문법이다. 먼저 람다 표현식을 사용하여 vector를 정렬하는 간단한 아래 예제를 살펴 보자. #include #include #include int main() { std::vector v = { 1, 3, 2, 5, 4 }; std::sort(v.begin(), v.end(), [](int a, int b) -> int { return a < b; }); for (int e : v) { std::cout
[C++] default move constructor 들어가며 [이전 포스트]에서는 move에 대한 기본 개념 필요 이유, 사용 방법에 대해 살펴 보았다. 이번 포스트는 앞의 내용에 이어 복사 생성자와 move 생성자의 자동 생성 규칙에 대해 살펴 보도록 한다. 먼저 아래의 다소 복잡해 보이는 코드를 먼저 살펴 보자. class String { public: String() = default; String(const String&) { std::cout
[C++] move semantics 들어가며 이번 포스트에서는 C++11에 추가 된 내용 중 매우 중요하게 다루어지는 move에 대해 살펴 보도록 한다. 필자의 경우 move에서 말하는 자원의 '복사' 대신 '이동' 시킨다는 메커니즘이 머리 속에서 그려지지 않아 move를 접한 처음엔 이해하는데 많은 어려움을 겪었다. 하지만 본 포스트를 읽는 여러분에게는 필자와 같은 어려움을 겪지 않도록 최대한 쉽게 move에 대해 접근해 보도록하겠다. NOTICE : move에 대해 이해하기 위해서는 r-value에 대한 이해가 먼저 필요하다. 만일 r-value에 익숙하지 않은 분이라면 [r-value 레퍼런스(reference) 완벽 가이드]를 먼저 읽고 돌아 오도록 하자. Move semantics란? 이번 섹션은 move라고 불리는, Move s..
[C++] r-value 레퍼런스(reference) 완벽 가이드 들어가며 C++11 부터 & 연산자로 표기 되는 참조 타입에 추가하여 && 연산자로 표기 되는 r-value 레퍼런스라는 새로운 개념이 추가 되었다. 이번 포스트에서는 r-value 란 무엇인지, 무슨 이유로 추가되었는지, 어떤 경우에 유용하게 사용할 수 있을지에 대해 자세히 살펴 보도록 하겠다. r-value 란? r-value 라는 용어가 생소한 분들을 위해 r-value가 무엇인지 먼저 알아 보도록 하자. r-value를 한줄로 요약하면 '오른쪽(right)에만 올 수 있는 값'이라고 정의할 수 있다. 아직 뜬 구름 잡는 소리 처럼 들리겠지만 잠시만 인내심을 가지고 아래 예제를 살펴 보자. int main() { int v1 = 0, v2 = 0; v1 = 10; // ok 10 = v1; // e..
[C++] constexpr 상수 들어가며 이번 포스트에서는 C++11 부터 새로이 추가된 constexpr 키워드에 대해 살펴 보도록 하겠다. 먼저 constexpr에 대해 이해하기 위해서는 기존 C++의 const에 대해 먼저 이해 해야할 필요가 있다. 아래 예제를 살펴 보자. int main() { const int c1 = 10; c1 = 20; // error! } 위 예제는 간단하게 const 상수를 정의하고 값을 변경하고 있다. C++에서 const 한정자로 정의된 변수는 값을 바꿀수 없음을 의미하므로 위 코드를 컴파일 하게 되면 에러가 발생하게 된다. 그리고 C++11 부터 상수를 만드는 또 다른 키워드인 constexpr이 등장한다. constexpr c2 = 10; c2 = 20; // error! constexpr 역..
[C++11] 주요 변경/추가 사항 람다 표현식(Lambda Expressions) 람다 표현식은 함수를 선언한 곳에서 바로 호출 할 수 있도록 한다. 람다 표현식은 아래와 같은 형태를 가진다. [capture] (parameters) -> return-type { body } for_each() 알고리즘을 사용하여 문자열을 순회하며 대문자의 개수를 센다고 가정하자. 대문자인지 판단하기 위한 함수 객체를 넘겨 주는 대신 람다 표현식을 사용하면 보다 편리하게 코드 작성이 가능하다. int main() { char s[]="Hello World!"; int Uppercase = 0; //modified by the lambda for_each(s, s+sizeof(s), [&Uppercase] (char c) { if (isupper(c)) ..

반응형