본문으로 건너뛰기
Minsing Log
뒤로 가기

object lifecycle(객체 생명주기로 인하여 destructor 호출여부 갈림)

Programming & CS

🎯 계기

두 코드의 차이점을 아는가?

  1. 1번코드
Point pt2(10, 20), pt3(30, 40);
    Point pt4 = pt2 + pt3;
  1. 2번코드
Point pt2(10, 20), pt3(30, 40), pt4;
pt4 = pt2 + pt3;

2번째 코드는 destructor가 호출된다. 5시간 도르마무 왜 destructor가 호출되는지 고민이 많았다.

🎯 결론

참고할만한 키워드


🌱 설명 1

첫 번째 코드에서 임시 객체는 초기화가 완료된 후에 소멸됩니다. 이는 C++ 표준에 따라 임시 객체의 생명 주기가 초기화가 완료될 때까지 연장되기 때문입니다. 두 번째 코드에서는 임시 객체가 대입 연산 후에 소멸되므로 디스트럭터가 호출됩니다.

첫 번째 코드

Point pt2(10, 20), pt3(30, 40);
Point pt4 = pt2 + pt3;

이 코드에서는 pt2 + pt3 연산이 임시 객체를 생성하고, 이 임시 객체는 pt4로 직접 초기화됩니다. 초기화가 완료된 후에 임시 객체는 소멸됩니다. 따라서 디스트럭터는 초기화가 완료된 후에만 호출됩니다.

두 번째 코드

Point pt2(10, 20), pt3(30, 40), pt4;
pt4 = pt2 + pt3;

이 코드에서는 pt4가 먼저 기본 생성자로 생성됩니다. 그런 다음 pt2 + pt3 연산이 수행되어 임시 객체가 생성됩니다. 이 임시 객체는 pt4에 대입됩니다. 대입 연산이 끝난 후, 임시 객체는 소멸되며, 이때 디스트럭터가 호출됩니다.

임시 객체의 소멸 시점

임시 객체는 전체 표현식이 평가된 후에 소멸됩니다. 첫 번째 코드에서는 초기화가 완료된 후에 임시 객체가 소멸되므로 디스트럭터가 호출됩니다. 두 번째 코드에서는 대입 연산이 완료된 후에 임시 객체가 소멸되므로 디스트럭터가 호출됩니다.

첫 번째 코드에서는 초기화가 완료된 후에 임시 객체가 소멸되고, 두 번째 코드에서는 대입 연산이 완료된 후에 임시 객체가 소멸됩니다.


🌱설명 2

디스트럭터 없이 두 객체를 더하는 + 연산자를 오버로딩하는 방법을 보여드리겠습니다. 여기서는 간단한 2D 벡터 클래스를 사용하여 연산자 오버로딩을 구현해 보겠습니다.

#include <iostream>

class Vector2D {
public:
    float x, y;

    Vector2D(float x = 0, float y = 0) : x(x), y(y) {}

    // + 연산자 오버로딩
    Vector2D operator+(const Vector2D& other) const {
        return Vector2D(this->x + other.x, this->y + other.y);
    }

    void print() const {
        std::cout << "(" << x << ", " << y << ")" << std::endl;
    }
};

int main() {
    Vector2D pt1(1.0, 2.0);
    Vector2D pt2(3.0, 4.0);

    // 두 객체를 더하는 연산
    Vector2D result = pt1 + pt2;

    result.print(); // 출력: (4.0, 6.0)

    return 0;
}

이 예제에서 Vector2D 클래스는 + 연산자를 오버로딩하여 두 벡터를 더할 수 있도록 합니다. pt1 + pt2 연산은 pt1 객체의 operator+ 메서드를 호출하여 pt2를 인자로 전달합니다. 결과적으로 새로운 Vector2D 객체가 반환됩니다.

이 코드를 실행하면 (4.0, 6.0)이 출력됩니다. 이 방식으로 디스트럭터 없이도 연산자 오버로딩을 할 수 있습니다.

Citations: [1] https://stackoverflow.com/questions/9351166/does-overloading-operator-works-inside-the-class [2] https://www.geeksforgeeks.org/operator-overloading-cpp/ [3] https://www.programiz.com/cpp-programming/operator-overloading [4] https://cplusplus.com/forum/beginner/60378/ [5] https://cplusplus.com/forum/beginner/187/ [6] https://learn.microsoft.com/en-us/cpp/standard-library/overloading-the-output-operator-for-your-own-classes?view=msvc-170 [7] https://cplusplus.com/forum/beginner/52664/ [8] https://en.cppreference.com/w/cpp/language/operators

공개 여정 구독

글이 올라오면 이메일로 보내드릴게요.

개발, 창업, 배움, 실패와 회고를 짧고 솔직하게 기록합니다. 검색으로 스쳐가는 독자가 아니라 여정을 따라오는 팬을 만들기 위한 뉴스레터입니다.

뉴스레터는 준비 중입니다. 그동안 RSS 로 구독하거나 이메일 로 알림을 요청해 주세요.


이 글 공유하기:

댓글

GitHub 계정으로 로그인해 댓글을 남길 수 있습니다.


이전 글
linux 생존일지 D-0 (wsl에서 우분투설치)
다음 글
Selecting right OS