std::string&&는 rvalue reference (우측값 참조)를 의미합니다. rvalue reference는 rvalue (임시 객체나 소멸 예정 객체)에만 바인딩할 수 있습니다.
include 전처리문을 통하여 c++에서 문자열을 다루기 위한 string class를 소스코드에 포함시킵니다.
std::move()는 parameter을 rvalue reference로 캐스팅합니다. 대입연산자와 함께 사용되므로, parameter를 캐스팅하고 이동시킵니다.
union은 C/C++에서 여러 멤버가 하나의 메모리 공간을 공유하는 사용자 정의 타입입니다. 모든 멤버는 같은 주소를 사용하므로, 한 멤버의 값을 바꾸면 다른 멤버에도 영향을 줍니다. 대표적으로 float과 byte 배열을 동시에 다룰 때 많이 사용됩니다.
default는 매개변수 없는 생성자만 자동 생성합니다.
upcasting이란 자식 클래스의 객체를 부모 클래스 타입으로 변환하는 것입니다. upcasting은 안전하며 자동으로 일어납니다.
virtual 상속은 다중 상속 시 중복 상속 문제(Diamond Problem)를 방지하기 위해 사용됩니다. virtual 함수는 함수를 자식 클래스에서 오버라이딩하고, 부모 포인터로 호출해도 자식 함수가 실행되게 합니다.
override는 단순히 부모 클래스의 함수를 물려받는 게 아니라 고쳐서 다른 동작을 하도록 만드는 것입니다.
struct는 사용자 정의 자료형으로, 여러 변수(멤버)를 하나로 묶을 수 있습니다. class와 거의 동일하지만, 기본 접근 지정자가 public이라는 차이점이 있습니다. 멤버 변수와 함수, 생성자, 소멸자 등도 포함할 수 있습니다. 상속과 다형성도 지원합니다.
가상 소멸자는 "부모 포인터로 자식 객체를 delete할 때" 꼭 필요합니다. new/delete, 스마트 포인터와 같이 동적 메모리 해제 시에 특히 중요합니다. 스택에 생성된 객체나 다형성을 사용하지 않는다면 가상 소멸자가 없어도 문제 없습니다.
Heap에 메모리를 동적으로 할당할 때 사용한다.객체 또는 기본형 타입을 동적으로 생성한다.메모리가 성공적으로 할당되면 포인터를 반환한다.new로 할당한 메모리를 해제할 때 사용한다.delete를 호출하지 않으면 메모리 누수(memory leak)가 발생할 수 있다.
순수가상함수를 포함하는 클래스는 추상 클래스가 됩니다. 추상 클래스는 instance를 만들 수 없습니다. 공통된 interface만 정의합니다. 구체적인 구현은 파생 클래스가 합니다.
operator는 클래스에 형 변환 함수를 정의할 수 있습니다. C++이 기본으로 제공하는 내장된 암시적 변환이 있지만 사용자 지정 클래스에서는 operator 키워드를 사용해야합니다. explicit은 암시적 변환을 막습니다.
template은 C++에서 일반화 프로그래밍(Generic Programming) 을 가능하게 해주는 문법입니다. 즉, 자료형(type)에 관계없이 하나의 함수나 클래스를 다양한 타입에 대해 동작하도록 만들 수 있게 해줍니다.
생성자는 일반적으로는 모든 타입에 대해 같은 방식으로 동작하지만, 어떤 특정 타입(int)에 대해선 다르게 동작하게 하고 싶을 때 탬플릿 특수화를 사용합니다.
→ A type의 객체를 동적으로 생성하고, 이를 가리키는 std::shared_ptr< A > type의 변수 p11을 선언하였다.std::shared_ptr< T >는 동적으로 할당된 객체를 여러 개의 포인터가 공유할 수 있게 해 주는 스마트 포인터. 객
c-style의 문자열은 char array 또는 pointer를 통해서 문자열을 나타냅니다. 끝에 null 문자로 문자열 끝을 표시합니다. 반면 c++ style의 문자열은 class이기 때문에 객체로 다룹니다. 메모리를 자동으로 관리하므로 편리합니다.
const T는 복사하고, const T&는 참조만 합니다. 복사비용이 큰 객체일수록 const T&가 빠르고 메모리가 절약됩니다.
람다 함수(lambda function)는 이름 없는 함수(익명 함수)로, 한 줄로 간단한 함수를 만들고 싶을 때 사용하는 문법입니다. 람다 함수에서의 capture(캡처)는 람다 함수 바깥에 있는 변수들을 안으로 가져오는 방법입니다.
iterator는 자료구조의 요소들을 하나씩 순차적으로 접근할 수 있게 해주는 객체형 포인터입니다.
멤버 변수의 수정에는 참조가 필요 없습니다.
생성자가 정의되어 있는 클래스의 객체를 선언하면, 생성자가 자동 호출됩니다.
Base(x)는 멤버 초기화가 아니라 생성자 호출입니다.여기서 Base(x)는⚠️ Base 클래스의 private 멤버 x에 직접 접근하는 게 아닙니다. Base(int) 생성자를 호출해서 Base 내부에서 알아서 private 멤버 x를 초기화하는 것입니다.
std::function은 C++ STL에서 제공하는 함수 래퍼(wrapper)로,함수, 람다, 함수 객체, 멤버 함수 포인터 등 다양한 호출 가능한(callable) 것을 하나의 타입으로 다룰 수 있게 해주는 템플릿 클래스입니다.
std::function에는 함수의 주소를 저장해야 될까요?항상 함수의 주소만 저장하는 건 아닙니다. 호출 가능한 모든 것"을 값처럼 저장한다.이건 맞아요. 함수 포인터를 저장한 거예요.
왜 std::function이 동적 메모리 할당을 유발하는가?