본문 바로가기

C++11

C++11 스마트포인터 auto_ptr은 더이상 쓰지 않는다 http://egloos.zum.com/sweeper/v/2826435 스마트 포인터를 사용하기 위해서는 #include using namespace std; 가 필요하다. make_unique - 이동만 가능하며, 복사는 허용하지 않음 http://en.cppreference.com/w/cpp/memory/unique_ptr auto sp = std::make_unique(12); //auto sp2 = sp; // error auto sp3 = std::move(sp); // sp는 이제 empty, 소유권은 sp2에게 넘어감 make_shared - 포인터 복사가 가능, 내부적으로(Control Block) 참조카운트를 가지고 있음 http://en.cppref.. 더보기
C++11 재정의규칙과 override class A{public:virtual void doWork() { printf(" I am A");}}; class B : public A{public:virtual void doWork(); { printf(" I am B");}}; using namespace std; unique_ptr object = make_unique(); object->doWork(); 하면 어떻게 될까? B클래스에서 doWork()를 재정의 하였기 때문에 당연히 "I am B" 가 출력이 된다. 이와 같이 멤버함수의 재정의를 하기 위해선 몇 가지 조건을 만족해야 한다. * 기본 클래스 함수가 반드시 가상 함수이어야 한다. * 기본 함수와 파생 함수의 이름이 반드시 동일해야 한다 (소멸자는 예외) * 기본 함수와 파생 함.. 더보기
C++11 이동생성자 (Move Constructor) Rvalue Reference가 추가되면서 같이 추가된 이동생성자에 대한 설명이다. 이동생성자를 사용하는 궁극적인 목적은 바로 성능향상인데, 아래의 예제를 통해 설명함. #include #include #include using namespace std; struct Person{string name;int year; Person(string p_name, int p_year): name(move(p_name)), year(p_year){cout 더보기
C++11 RValue Reference - 우측값 참조 => 1+2; 이와 같이 3이라는 숫자가 생성되자 마자 사라지는 값을 c++에서는 우측값이라고 한다. => int sum = 1+2; 반면 sum과 같이 기억되는 변수를 왼쪽값이라고 한다. c++를 처음 배울때 값에 의한 전달, 참조에 의한 전달이라는 것을 배우는데, 여기서 참조전달은 정확히 이야기하면 왼쪽값 레퍼런스 전달을 의미한다. 예를 들어, void SetName(string& name) { m_name = name; } SetName의 파라미터는 name이라는 왼쪽값 참조를 전달하고 있다. C++11 에서는 오른쪽값 레퍼런스도 가능하게 하였는데, 표시는 기존의 &와 비슷한 &&를 사용한다. int nCount; // nCount는 왼쪽값 int& lrefValue1 = nCount; // 왼쪽값.. 더보기
C++11 클래스멤버변수를 선언과 동시에 초기화 C++11 이 도입되면서 정말 편하게 느껴졌던 기능중 하나는 바로 이거다. class A { public: int a = 7; }; 멤버변수를 선언과 동시에 초기화가 가능해졌다는 것이다. C++98 에서 정적상수 변수만 가능했던 문법이 이렇게 바뀌게 되었다. 이는 런타임 생성자 호출때 이 초기화 수식을 이용할 수 있게 된다 그렇다면 선언과 동시에 초기화를 하면서 생성자에서도 초기화를 한다면? class A { public:A(): a(77) { }}; 생성자의 초기화가 우선 적용된다. 참고사이트 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2628.html 더보기
C++11 constexpr - Scott Meyers 강의 후기 이번 2016 NDC에서 스캇메이어스 아저씨의 강연중 나온 내용이다. C++11 에서 추가된 CONSTEXPR! 스캇아저씨가 매우 흥미롭다며 소개해준 파트중 하나였는데, 일반적인 설명은 넷상에도 많이 있으니 참고하면 되고, https://msdn.microsoft.com/ko-kr/library/dn956974.aspx http://egloos.zum.com/sweeper/v/3147813 링크에도 나와있는 내용이지만, 언뜻 템플릿메타 프로그래밍과 비슷해 보이지만, 템플릿함수는 컴파일타임에 수행이 되므로 파라미터가 상수여야 하지만, constexpr 함수는 런타임에도 사용이 가능하다는 점이다. 또한 C++14에서 좀 더 제약이 적어졌다는 것이다. 그 예로 리턴표현식이 하나만 가능했던점이 여러개 지원이 가.. 더보기
C++11 람다식 정리(lamda) [my_mod](int v_)->int{return v_ % my_mod;} //클로져 (Closure) 객체라고 명명 [] : 아무것도 캡처하지 않음 [&x] : x만 Capture by reference [x] : x만 Capture by value [&] : 모든 외부 변수를 Capture by reference [=] : 모든 외부 변수를 Capture by value [x, y] : x, y 를 Capture by value [&x, y] : x는 Capture by reference, y는 Capture by value [&x, &y] : x, y 를 Capture by reference [&, y] : y 를 제외한 모든 값을 Capture by reference [=, &x] : x 를 제.. 더보기
C++11 enum class 다음은 C++11 에서 강화된 enum 기능이다. 1. 중복 정의 가능 enum Car{SONATA,AVANTE,}; enum FakeCar{SONATA,AVANTE,}; 재정의로 에러가 난다. 하지만, class 한정자를 붙여주면? enum class Car{SONATA,AVANTE,}; enum class FakeCar{SONATA,AVANTE,}; 깔끔하게 컴파일 된다. 2. 타입 강화 enum Car : unsigned int{SONATA = 1,AVANTE = 2,}; enum FakeCar : unsigned int{SONATA2= 1,AVANTE2 = 2,}; if( Car::AVANTE == FakeCar::SONATA2 ){// 기존과 마찬가지로 컴파일 가능} 하지만, 위와 마찬가지로 c.. 더보기
C++11 Visual Studio 기능지원 목록 한동안 C#보다는 C++ 자료를 더 포스팅 할 것 같다. 암튼 여기서는 획기적(?)이라 할 수 있는 C++11 에 대한 지원목록을 표시해 본다. 어차피 msdn에 있는거지만 나중에 조금 더 편하게 찾아볼 수 있게 그냥 정리하는 용도 VS2010 부터 부분적으로 지원을 하며 2015이상을 사용해야 대부분의 기능을 지원한다. C++11 핵심 언어 기능Visual Studio 2010Visual Studio 2012Visual Studio 2013Visual Studio 2015Rvalue 참조 v0.1, v1.0, v2.0, v2.1, v3.0v2.0v2.1*v2.1*v3.0ref-qualifiers아니요아니요아니요예비정적 데이터 멤버 이니셜라이저아니요아니요예예Variadic 템플릿 v0.9, v1.0아니요.. 더보기