클래스 객체를 참조자로 전달
Call by value방식에 의해 객체를 전달하는 경우, 그 객체의 복사본이 작성되어 함수에 전달한다. 이것은 새로운 객체가 생성된 것을 의미하며 호출 함수의 실행이 종료되면 객체의 복사본은 소멸한다.
따라서 call by value 방식으로 객체의 복사본이 생성되면 생성자 함수와 소멸자 함수가 자동으로 소멸되어야 한다. 하지만 call by value 방식에 의해 생성된 객체는 생성자 함수는 호출되지 않는다. 객체의 현재 상태를 함수에 그대로 전달할 필요가 있는데, 만일 생성자 함수가 다시 호출되면 원래 객체 상태로 변하기 때문이다. 단, 호출 함수의 실행이 종료되면 복사된 객체가 소멸되면서 소멸자 함수가 자동으로 호출된다.
프로그래밍을 하다 보면 call by value 방식으로 인해 복사본 객체에 소멸자 함수가 호출되어 심각한 문제가 발생하는 경우가 생긴다. 예를 들어 생성자 함수로 의해 동적으로 메모리를 할당하고 객체가 소멸될 때 할당된 메모리를 소멸자 함수로 해제하는 경우이다.
그러나 호출 함수에 객체를 call by reference (참조자)로 전달하면 객체의 복사본이 작성되지 않기 때문에 호출 함수의 실행이 종료되어도 소멸자 함수가 호출되지 않는다. 따라서 원래의 객체에서 사용한 변수가 파괴되는 것을 방지할 수 있다.
예제 1
#include <iostream>
using namespace std;
class myclass {
private:
int a;
public:
myclass(int i) { //생성자 함수
a = i;
cout << "생성자를 수행합니다." << endl;
}
~myclass() { //소멸자 함수
cout << "소멸자를 수행하였습니다." << endl;
}
int output_return() {
return a;
}
};
int sum(myclass ob) //sum() 함수의 정의
{
return ob.output_return() + ob.output_return();
}
int main()
{
myclass ob1(10);
cout << sum(ob1) << endl; //sum()함수의 실행이 종료되면 소멸자 함수가 자동으로 호출
return 0; //프로그램 종료로 소멸자 함수가 자동으로 호출
}
실행 결과
생성자를 수행합니다.
20
소멸자를 수행하였습니다.
소멸자를 수행하였습니다.
※ Call by value 방식에 의해 객체를 호출 함수에 전달하면서 생성자 함수는 호출되지 않지만 소멸자 함수는 자동으로 호출된다.
※ 소멸자 함수는 두 번 호출되어 실행된다. 첫 번째는 sum() 함수의 실행이 종료되어 복사본 객체가 소멸될 때이고, 두 번째는 프로그램이 종료되어 본래의 객체 ob1이 소멸될 때이다.
예제 2
#include <iostream>
using namespace std;
class myclass {
private:
int a;
public:
myclass(int i) { //생성자 함수
a = i;
cout << "생성자를 수행합니다." << endl;
}
~myclass() { //소멸자 함수
cout << "소멸자를 수행하였습니다." << endl;
}
int output_return() {
return a;
}
};
int sum(myclass &ob) //sum() 함수의 정의, call by reference 사용
{
return ob.output_return() + ob.output_return();
}
int main()
{
myclass ob1(10);
cout << sum(ob1) << endl; //sum()함수의 실행이 종료되면 소멸자 함수가 자동으로 호출
return 0; //프로그램 종료로 소멸자 함수가 자동으로 호출
}
실행 결과
생성자를 수행합니다.
20
소멸자를 수행하였습니다.
※ call by reference 방식에 의해 객체를 호출 함수에 전달하면 생성자 함수와 소멸자 함수가 자동으로 호출되지 않는다.
참고
1. 장인성 외 5인, (초보자도 쉽게 따라 할 수 있는) C++프로그래밍, 광문각, 2017.02.13
'C++ 기초 1' 카테고리의 다른 글
| [C++] 4-1 클래스의 상속 (inheritance) (1) | 2023.12.19 |
|---|---|
| [C++] 3-5 프렌드 (friend) 함수 사용 이유 및 예제 (0) | 2023.12.18 |
| [C++] 3-3 소멸자 (Destructor) 설명 및 예제 (0) | 2023.12.12 |
| [C++] 3-2 클래스 생성자와 포인터 (0) | 2023.12.11 |
| [C++] 3-1 클래스 생성자(Constructor) (2) | 2023.12.07 |