스마트포인터 # 포인터처럼 동작하는 클래스 템플릿이며, c++11부터 표준에 포함되어 <memory> 헤더에 정의되어있다.
RAII패턴으로, 지역변수처럼 선언해서 동작하기 때문에 스코프를 벗어나며 클래스의 소멸자가 호출될때 가리키고있던 원시포인터가 사용되지 않을경우 자동으로 할당한 메모리도 해제해줘서 메모리 leak(댕글링포인터)에서 안전하게 사용할 수 있다. 예외 발생시에도 소멸자를 호출해줘서 자동으로 메모리를 해제해준다.
deleter # 포인터를 지울때 deleter를 호출해서 지운다.
1template<typename T> 2struct default_delete<T[]> 3{ 4void operator()(T* ptr) const 5 { 6 static_assert(sizeof(T)>0, "can't delete pointer to incomplete type"); 7 delete [] ptr; 8 } 9}; 10 11auto deleter = default_delete<int>(); 12int* i = new int(); 13deleter(i); 비교연산자 # shared_ptr, unique_ptr에 구현되어 있다.
...
Uniform Initialization # 객체를 생성자와 함께 호출하려면 ( ) 를 사용했다.
1// vector(size_type count, const T& value) 호출해서 생성 2vector<int> vec(3, 10); Most Vexing Parse
아래의 경우에는 무슨 일이 일어날까? 기본생성자? vector를 리턴하고 인자를 받지않는 vec 함수?
c++에서는 이것을 함수의 선언으로 생각한다. 1vector<int> vec(); 2class A { 3 public: 4 A() { std::cout << "A 의 생성자 호출!" << std::endl; } 5}; 6class B { 7 public: 8 B(A a) { std::cout << "B 의 생성자 호출!
...
const # 변수를 상수화해서 값 변경이 불가능하도록 한다. 포인터 왼쪽에 const를 붙이면 해당 포인터로 접근하는 기능을 상수화 한다는 뜻이다. 하지만 컴파일 타임에 상수일 필요는 없다.
1const int a; // Error! 초기화 하지않아서 에러 발생 2 3const int b = 10; // 변수 b의 상수화 4b = 20; // Error! 상수의 변경 불가 5 6int c = 10; 7const int* d = &c; // 포인터의 상수화 8*d = 50; // Error!
...
람다 vs 클로저? # c++11 부터 지원하는 람다 식은 말그대로 표현식이며 소스코드 상에서만 존재하고 컴파일 이후 익명함수 객체(클로저)를 생성하는 식을 의미한다.
1auto f = [&](int x, int y) { return fudgeFactor * (x + y); }; 여기서 = 오른쪽에 있는 식이 람다식이며 컴파일 이후에는 클로저로 변한다. f는 클로저가 아닌 클로저의 복사본이며 식의 끝줄에서 파괴된다.
보통 람다식은 함수의 인자로 사용될 함수 객체를 간단하게 정의하기 위해 사용된다.
람다 표현식 구조 # 1.
...
문자열 리터럴 # Raw 문자열 리터럴 # 지원: c++11
기존 문자열은 “…” 로 감싸고 내부의 특수문자를 이스케이핑 처리해줘야 하지만, R"(…)" 문자열은 이스케이핑 처리해줄 필요가 없는건 아니고 문자열을 닫는 )" 를 표시하기 위해서는 이스케이핑 처리해줘야 한다. 정규식 패턴을 표현할 때 유용하다.
1cout << R"(!@#$%^&*(\'"<>?:;)"; 2cout << LR"(!@#$%^&*(\'"<>?:;)"; // wchar_t를 의미하는 L 과 혼용 가능 유니코드 문자열 리터럴 # 지원: c++11
다국어 지원이나 특수문자 처리할때 유용하다.
1auto s0 = "hello"; // const char* 2auto s1 = u8"hello"; // const char* before C++20, encoded as UTF-8, 3 // const char8_t* in C++20 4auto s2 = L"hello"; // const wchar_t* 5auto s3 = u"hello"; // const char16_t*, encoded as UTF-16 6auto s4 = U"hello"; // const char32_t*, encoded as UTF-32 추가된 초기화 방식 # 지원: c++11
...