C++

    C++ Copy and Swap idiom

    C++에선 클래스가 리소스를 관리하고 클래스의 생성/소멸에 맞춰 리소스를 할당/해제한다. 관련된 멤버 함수와 그 역할은 아래와 같다. 생성자: 리소스를 할당한다. 복사 생성자: 리소스를 복사해온다. 복사 대입 연산자: 기존 리소스를 해제하고 리소스를 복사해온다. (C++11부터) 이동 생성자: 리소스를 가져온다. (C++11부터) 이동 대입 연산자: 기존 리소스를 해제하고 리소스를 가져온다. 소멸자: 리소스를 해제한다. Copy-and-swap idiom은 간결하면서도 강력한 예외 안정성(strong exception safety)을 보장해주는 복사 대입 연산자를 짤 수 있게 해준다. 또한 이동 대입 연산자에를 짤 때에도 유용하다. 문자열 리소스를 관리하는 간단한 클래스를 생각해보자. class Foo ..

    C++ 위임 생성자 (delegating constructor)

    위임 생성자는 특정 생성자를 호출하기 전 다른 생성자를 먼저 호출하는 것이다. 상속 받을 때처럼 : 기호를 써야한다. member-initializer-list(멤버 초기화 리스트)를 가질 수가 없다. 즉 아래에 mX(X), mY(Y) 에서 다른 생성자 호출이 불가능하다. Parent(int X) : Parent() 여기서는 Parent가 먼저 호출되고 int형 파라미터 들어간 생성자가 호출 된다. 자식 클래스에서 또한 부모 클래스의 생성자를 쓸 수가 있다, 부모 생성자에선 자식 생성자를 대리로 호출하는건 불가능하다. 마찬가지로 부모 클래스의 생성자가 호출 되고 자식 클래스의 생성자가 호출된다. #include #include using namespace std; class Parent { int mX ..

    C++ vector empty()와 size()간 차이

    vector::empty() 벡터가 비어있는지 확인하는 함수이다. Input : myvector = 1, 2, 3, 4, 5 myvector.empty(); Output : False Input : myvector = {} myvector.empty(); Output : True 시간 복잡도 : O(1) #include #include using namespace std; int main() { vector myvector{}; if (myvector.empty()) { cout

    C++ NULL과 nullptr의 차이

    1. int* 포인터에 정수 값 대입 int Integer, *Pointer; void print(int ptr) { Integer = ptr; cout

    C++ vector사용법 및 설명 (장&단점)

    vector vect; // vect는 stack, 각 원소들은 heap vector *vect = new vector; // vect와 각 원소들 모두 heap vector vect; // vect는 stack, 각 원소들은 heap 그리고 가리키는 대상들은 heap 또는 stack https://stackoverflow.com/questions/8036474/when-vectors-are-allocated-do-they-use-memory-on-the-heap-or-the-stack 속도적인 측면에서 array(배열)에 비해 성능은 떨어지지만 메모리를 효율적으로 관리하고 예외처리가 쉽다는 장점이 있다. Vector의 초기화 vector 변수명 백터 생성 vector 변수명(숫자) 숫자만큼 백터 생성 ..

    C++ 가변 길이 배열 (Variable Length Array)

    가변 길이 배열은 2차원 배열에서 각각의 첫번째 원소에 다른 길이의 배열을 담는 것이다. 아래는 C 스타일이다. #include using namespace std; int main() { // ------- 고정 길이 배열 ------- int arr[10]{ 5 }; for (int i = 1; i < 10; i++) arr[i] = arr[i - 1] + 5; // ------- 가변 길이 배열 (C 스타일 배열 사용) ------- int arr2[3]{ 1, 2, 3 }; int arr3[5]{ 4, 5, 6, 7, 8 }; int* variableArr[3]; *variableArr = arr; *(variableArr + 1) = arr2; *(variableArr + 2) = arr3; c..

    C/C++ 포인터 역참조 (deference)

    배열의 포인터는 크게 *(단일 포인터) 또는 **(이중 포인터)로 받을 수가 있다. 역참조는 해당 포인터가 자기 자신을 가리키게끔 하는건데 예시로 *ptr이면 ptr-> 성질과 비슷하다, 즉 null 포인터일 시 당연히 뻥난다. *ptr는 arr의 시작 주소를 받아내고 전체 배열의 접근이 가능하다. *ptr2는 단일 주소 포인터다, 오직 할당받은 &배열[인덱스]에만 접근 가능하다. *(ptr3)[10] 이건 이중 포인터로 받아내는 것이다, 2차원 배열 또는 포인터 배열로 접근할 수가 있다. #include using namespace std; int main() { int arr[10]{ 5 }; for (int i = 1; i < 10; i++) arr[i] = arr[i - 1] + 5; int* p..

    C++ 얕은 복사 깊은 복사 (Shallow/Deep Copy)

    아래와 같이 코드를 작성하면 a1 객체와 a2 객체가 서로 같은 int형에 대한 포인터 변수를 공유하기 때문에 이미 해제된걸 재해제 하기 때문이다. #include using namespace std; class A { int* ptr = nullptr; public: A() { ptr = new int(); } A(const A& Ref) { this->ptr = Ref.ptr; } ~A() { delete ptr; } }; int main() { // 기본 생성자 호출 A a1; // 복사 생성자 호출 A a2(a1); } 이를 해결하기 위해선 ptr를 참조 대상값 가지고서 재 할당 해줘야한다. #include using namespace std; class A { int* ptr = nullptr;..

    C++ 임시 객체 (Temporary Object)

    임시 객체를 r-value로 알고있는데 이는 틀렸다, 임시 객체 또한 const&로 파라미터로 넘길 수가 있다. r-value move semantics #include using namespace std; class Vector { public: float x = 0, y = 0, z = 0; public: Vector(float Val) : x(Val),y(Val),z(Val) { } static float Length(const Vector& Vec) { return Vec.x + Vec.y + Vec.z; } }; int main() { cout

    C++ 부모 클래스 함수 호출과 오버라이딩 (override)

    오버라이딩 핵심 개념 오버라이딩은 부모 클래스에서 정의한걸 재정의 하는 것이다. 추상클래스 (순수 가상 함수) 참조 아래와 같이 부모 클래스에선 virtual 키워드를 붙여준 뒤 함수를 정의하고 자식 클래스에서 재정의 하는 것이다. virtual로 시작 (생략 가능) 그리고 마지막엔 override 붙일 수가 있다. (이것 또한 생략 가능) #include using namespace std; class Parent { int mVal = 0; public: virtual void Fn1() { } virtual void Fn2() { } virtual void Fn3() { } virtual void Fn4() = 0; }; class Child : public Parent { public: void ..