본문 바로가기

c++11

[C++11] static_assert를 통한 컴파일 타임 검증 static_assert는 컴파일 타임에 소프트웨어 assertion을 위해서 추가된 문법입니다. 만약 작성된 constant-expression이 false(거짓)일 경우에 컴파일러는 메시지를 출력하고 C2338 에러를 출력합니다. 만약 true라면 아무런 영향도 발생하지 않습니다. 이미 C++에는 #error 전처리기 지시자와 assert 매크로를 통해서 assertion 처리가 가능합니다. 다만 C++의 assert는 런타임에 비교를 수행하기 때문에 성능의 하락을 가져올 수 있는 단점이 있습니다. 컴파일 타임에 해당하는 문제를 더 빨리 찾아내는 것이 모든 면에서 더 낫다고 할 수 있습니다. #error의 경우는 컴파일 타임에 처리가 가능합니다. 다만 템플릿이 구체화되기 전에 수행되버리기 때문에 템플.. 더보기
[C++11] default와 delete 키워드 C++의 클래스는 기본적으로 다음의 특수한 멤버 함수를 생성합니다.기본 생성자 복사 생성자 복사 대입 연산자 소멸자클래스를 생성하고 아무것도 하지 않아도 위의 4개는 기본적으로 생성됩니다.이것으로 클래스는 기본적으로 아무것도 추가하지 않아도 생성, 복사, 소멸이 가능해집니다.C++11에서는 기본적으로 생성되는 특수 멤버 함수에 무브 생성자와 무브 대입 연산자가 추가되었습니다.이 특수한 멤버 함수들을 명시적으로 선언하면 다음과 같은 규칙이 발생합니다.1. 어떤 생성자(복사 생성자 포함)가 명시적으로 선언된 경우 기본 생성자는 자동적으로 생성되지 않는다.2. 가상 소멸자가 명시적으로 선언된 경우 기본 소멸자가 자동적으로 생성되지 않는다.3. 무브 생성자나 무브 대입 연산자가 명시적으로 선언된 경우 1) 복사.. 더보기
[C++11] 새로운 스마트 포인터 unique_ptr(auto_ptr의 대체) C++11에서 auto_ptr이 사라지고 unique_ptr이 새로 추가되었습니다.auto_ptr의 문제점에 대해서는 아래의 글을 확인하시면 됩니다.2014/12/08 - [Programming/C&C++] - 스마트하지 못한 스마트한 포인터 auto_ptrauto_ptr을 대체하는 unique_ptr에 대해서 알아보도록 하겠습니다.unique_ptr은 auto_ptr과 거의 유사한 멤버를 가지고 있습니다.동적 할당된 포인터를 받아서 해당 포인터를 핸들링하고 자동으로 메모리를 해제하는 역할까지 동일합니다.* 연산자나 -> 연산자도 auto_ptr과 동일하게 지원합니다.unique_ptr을 생성하는 코드를 보도록 하겠습니다. #include #include #include struct TestStuff {.. 더보기
sealed 키워드를 사용한 클래스 상속 방지 C++에서는 일반적으로 상속을 막는 방법이 없었습니다.MFC에서는 CString을 상속해서 확장하는 것을 권하지 않고 있습니다.(CString은 CStringT 템플릿을 사용하게 되어 있는데 소멸자가 virtual이 아닙니다.)하지만 이것을 강제할 방법은 없었습니다.다만 C++11 이후에 상속을 막을 수 있는 키워드가 추가 되었습니다.다음 링크에서 확인이 가능합니다.2014/12/21 - [Programming/C++11&14] - [C++11] final과 override물론 생성자등을 private로 선언하거나 하면, 원하는 기능을 구현할 수는 있습니다.하지만 C#에서는 좀 더 쉽게 상속을 막을 수 있는 장치가 마련되어 있습니다.이렇게 무분별한 상속을 막기 위해서 C#에서는 sealed라는 키워드가 .. 더보기
[C++11] cbegin()과 cend(), crbegin()과 crend() C++의 STL 컨테이너들은 Iterator(반복자)를 통해서 내부에 있는 데이터의 한 위치를 가리킬 수가 있습니다.Iterator의 종류는 Input, Output, Foward, Bidirectional, Random Access로 구분할 수 있습니다.Input과 Output은 각각 출력과 입력만을 담당하는 최소한의 기능을 가지고 있는 Iterator입니다. Foward의 경우는 순방향 Iterator로 한 쪽으로(처음 -> 끝) 이동하는 Iterator입니다.Bidirectional은 이름 그대로 양방향으로 이동이 가능한 Iterator입니다.Random Access는 랜덤하게 한 곳을 콕 찝어서 이동이 가능한 Iterator입니다.Input -> Foward -> Bidirectional -> R.. 더보기
[C++11] final과 override C++에서는 명시적으로 클래스의 상속을 막는 방법이 없었습니다.C++ CLI 등에서 selaed라는 키워드가 존재했지만 이것은 표준이 아닌 MS 확장 키워드입니다.C# 역시 sealed라는 키워드를 사용합니다.C#의 sealed 키워드에 대한 내용은 다음 링크에서 확인 가능합니다.2014/12/27 - [Programming/C#] - sealed 키워드를 사용한 클래스 상속 방지C++ CLI나 C#이나 모두 닷넷을 지원하기 위해서 만들어진 것을 생각하면 공통된 특정 키워드가 있는 것이 이해가 갑니다.C++11에서는 상속을 정교하게 다루기 위해 final과 override라는 새로운 키워드가 추가되었습니다.final은 상속을 차단하기 위해 추가된 키워드이고, override는 클래스의 메소드를 명시적으로.. 더보기
[C++11] RValue Reference(4) 6. RValue Reference의 추가적인 특징RValue Reference의 추가적인 특징들입니다.이미 설명한 것과 같이 RValue의 Move Sematics와 Perfect Fowarding은 성능 향상에 많은 도움을 제공합니다.그 외 RValue Reference의 추가적인 특징은 다음과 같습니다.1) RValue Reference와 LValue Reference를 받는 함수를 오버로딩 가능하다.RValue와 LValue는 다르게 취급되기 때문에 RValue Reference와 LValue Reference를 전달받는 함수는 오버로딩이 가능합니다.이미 생성자와 대입 연산자를 통해서 알아 본 내용입니다. #include using namespace std; // A class that conta.. 더보기
[C++11] RValue Reference(3) 5. Forwarding Problem과 Perfect FowardingFowarding Problem은 레퍼런스 타입을 매개 변수로 갖고 있는 제너릭 함수에서 발생할 수 있습니다.레퍼런스 타입의 매개변수를 다른 함수에 전달해 주는 과정에서 발생할 수 있습니다.예제를 먼저 확인하겠습니다. struct W { W(int&, int&){} }; struct X { X(const int&, int&){} }; struct Y { Y(int&, const int&){} }; struct Z { Z(const int&, const int&){} }; template T* factory(A1& a1, A2& a2) { return new T(a1, a2); } int main() { int a = 4, b = 5;.. 더보기