본문 바로가기

C++ 기초 1

[C++] 2-9 함수의 객체 전달 (value 및 포인터)

함수의 객체 전달

   함수를 호출하는 경우에 데이터를 매개변수로 함수에 넘거질 수 있듯이 클래스 객체들을 함수에 전달할 수 있다. 이때 매개변수는 call by value 방식으로 함수에 전달된다. 즉, 객체의 복사본은 stack이라는 메모리 영역에 저장하여 매개변수로 전달하기 때문에 함수의 호출이 늦어지게 된다. 함수의 매개변수로 구주체나 객체를 사용하는 경우에는 call by reference 방식을 사용하면 함수 호출 속도를 향상시킬 수 있다. 

 
예제 1
#include <iostream>
using namespace std;
class myclass {
private:
	int a;
public:
	void set(int i) {
		a = i;
	}
	void re_set(int i) {
		a = i;
	}
	int output_return() {
		return a;
	}
};
void sum(myclass ob);

int main()
{
	myclass ob1;
	ob1.set(10);
	sum(ob1);
	cout << "ob1.a: " << ob1.output_return() << endl;
	return 0;
}

void sum(myclass ob)
{
	int x;
	x = ob.output_return() + ob.output_return();
	ob.re_set(x);
	cout << "ob.a: " << ob.output_return() << endl;
}
실행 결과
ob.a: 20
ob1.a: 10
※ main() 함수에서 sum() 함수를 호출할 때 매개변수인 객체 ob1을 ob로 전달한다. 이때 매개변수 전달 방식이 call by value이기 때문에 함수의 실행 중에 객체 ob의 값을 바꾸더라도 ob1의 데이터 멤버에는 영향을 주지 않는다.   

 

예제 2
#include <iostream>
using namespace std;
class myclass {
private:
	int a;
public:
	void set(int i) {
		a = i;
	}
	void re_set(int i) {
		a = i;
	}
	int output_return() {
		return a;
	}
};
void sum(myclass *ob);

int main()
{
	myclass ob1;
	ob1.set(10);
	sum(&ob1);
	cout << "ob1.a: " << ob1.output_return() << endl;
	return 0;
}

void sum(myclass *ob)
{
	int x;
	x = ob->output_return() + ob->output_return();
	ob->re_set(x);
	cout << "ob.a: " << ob->output_return() << endl;
}
실행 결과
ob.a: 20
ob1.a: 20
※ 매개변수 객체 ob1의 시작 주소 (&ob1)를 ob로 전달한다. 이때 매개변수 전달 방식이 call by reference이기 때문에 ob의 값이 변하면 ob1의 값도 변한다. 
※ 클래스 포인터 변수 ob를 이용해서 객체 ob1의 각 멤버를 참조하는 경우 화살표 연산자 ->를 이용한다.
 
참고

1. 장인성 외 5인, (초보자도 쉽게 따라 할 수 있는) C++프로그래밍, 광문각, 2017.02.13