C++

    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 ..

    C++ 자기 자신 참조 (this)

    아래 코드를 살펴보면 Set 함수에서 멤버 변수 val에 파라미터로 넘어오는 값을 대입하고자 하는데 공교롭게도 val을 파라미터로 넘어오는 값으로 인식한다 val은 초기화가 안됐으므로 쓰레기값이 출력될거다. #include using namespace std; class Parent { int val; public: void Set(int val) { val = val; } int Get() const { return val; } }; int main() { Parent parent; parent.Set(10); cout

    C++ 추상 클래스 / 순수 가상 함수 (Pure Virtual Function)

    순수 가상함수란 선언(declaration)만 있고 구현(definition)이 없는 가상 함수다. virtual void Func() = 0; 추상 클래스 위와 같은 순수 가상함수를 하나라도 가지고 있는 클래스를 추상클래스(abstract class)라고 한다. 추상 클래스는 객체를 생성할 수 없다. 추상 클래스는 멤버 함수의 원형만을 정의하고 그 구현은 자식 클래스에서 하게 된다. 추상 클래스를 상속받는 자식 클래스는 반드시 순수 가상함수를 오버라이딩 하여 재정의 해야만 한다. 그렇지 않다면 아래 그림과 같이 컴파일 오류가 난다. 이렇게 추상클래스를 활용하면 파생클래스에서 순수 가상함수를 재정의 하게끔 강제할 수 있다. #include using namespace std; class Parent { ..