C++ 레퍼런스 관련 질문입니다.
#include
using namespace std;
class CLS {
private:
int x;
public:
CLS(int ax) : x(ax) {
cout << "생성되었음" << endl;
}
virtual ~CLS(void) {
cout << "파괴되었음" << endl;
}
void PrintExam(void) {
printf("출력성공? : %d\n", x);
}
};
CLS& function(CLS& obj) {
obj.PrintExam();
return obj;
}
int main(int argc, char *argv[]) {
CLS &obj = function(CLS(10));
obj.PrintExam();
}
위 소스코드의 실행결과 (VC++ 8.0 기준입니다) 다음과 같습니다.
생성되었음
출력성공? : 10
파괴되었음
출력성공? : 10
function함수는 CLS(10)으로 생성한 객체를 레퍼런스로 받아서 x값을 출력한 다음 다시 객체를 레퍼런스로
출력합니다. 그 레퍼런스는 CLS &obj에 대입되고, CLS(10)은 파괴자가 호출되어서 파괴됩니다. 하지만
CLS &obj 로 받은 객체로 obj.PrintExam() 을 실행해보면 다시 10이 나옵니다.
여기서 질문입니다. 왜 객체가 파괴되었는데 값은 똑같이 나오는 겁니까? 파괴자가 한번만 호출되는 것을 봐서 객체가 하나만 생성된 것은 확실해 보입니다. 혹시 주소가 틀린가 해서 x변수의 주소도 비교해보았지만, 주소도 같았습니다. 그렇다면 정적 객체생성일시 파괴자는 그 객체의 메모리를 해제할때 메모리를 쓰레기값으로 만드는게 아닌, 그 부분의 메모리에 대한 접근권한을 허용하도록 바꾸어주는 건가요?
혹시나 해서, new로 동적 생성을 한 후 delete선언 후 x에 해봤을때는 쓰레기값을 가지더군요.
파괴자의 정확한 동작원리 좀 알려주시기 바랍니다.