티스토리 뷰

아래 코드의 main 함수부터 순서대로 보자.

 

#include <iostream>

class Data {
public:
    int i;
    Data() {
        std::cout << "생성자" << '\n';
        this->i = 0;
    }
    Data(const Data& d) {
        std::cout << "복사 생성자" << '\n';
        this->i = d.i;
    }
    Data& operator=(const Data& d) {
        std::cout << "대입 연산자" << '\n';
        this->i = d.i;
        return *this;
    }
    ~Data() {
        std::cout << "소멸자 " << i << '\n';
    }
};

void foo(Data d) {
    std::cout << "foo1\n";
}

void foo2(Data& d) {
    std::cout << "foo2\n";
}

void foo3(Data* d) {
    std::cout << "foo3\n";
}

int main() {
    Data d; 	// 생성자 호출
    foo(d); 	// 복사 생성자 호출, 소멸자 호출
    foo2(d); 	// reference 로 보내는 것은 생성자 호출 안함
    foo3(&d); 	// pointer 로 보내는 것은 생성자 호출 안함
    std::cout << '\n';

    Data d2; 	// 생성자 호출
    d2 = d; 	// 대입 연산자
    std::cout << '\n';

    Data d3 = d; // 복사 생성자
    d.i = 1;
    d2.i = 2;
    d3.i = 3;

    // d3, d2, d1 순서대로 소멸자 호출
    // stack 에 쌓여있기 때문
    return 0;
}

 

댓글