728x90
개요
이 글에서는 C++에서의 값에 의한 전달과 참조에 의한 전달을 알아본다.
전에 포인터 관련 글을 작성하면서 배경지식 또한 미리 설명을 했기 때문에,
특정 상황에서 값에 의한 전달과 참조에 의한 전달의 장단점을 알아보겠다.
값에 의한 전달 vs 참조에 의한 전달
값으로 전달되면 객체의 새로운 사본이 생성되어 함수에 전달된다. 이 전달 방식은 굉장히 큰 객체를 전달하는 경우 사본을 생성하는 데 비용이 많이 든다. (낭비된다.) 그래서 복사 생성자를 private
로 선언하는 등의 방법을 통해 복사본을 생성하지 못하게 하는 경우도 있다.
참조로 전달하면 객체의 주소가 전달된다. 따라서 새로운 사본이 생성되지 않는다. 하지만 이 경우 함수는 목적에 따라 객체를 수정할 수 있다. 객체를 수정하지 못하게 하려면 const
참조로 객체를 전달하면 된다.
또 값으로 전달했을 때 발생 가능한 문제는 원하지 않는 암시적 변환이 일어날 수 있다는 점이다. 아래 코드를 살펴보자.
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
virtual string msg() { return "I am base";}
};
class Child : public Base
{
public:
virtual string msg() { return "I am child"; }
};
void cast(Base x) { cout<< x.msg() << endl; }
int main()
{
Base f;
Child b;
cast(f);
cast(b);
return 0;
}
이 코드는 cast
를 호출했을 때 모두 "I am Base"를 출력한다.
cast()
를 다음과 같이 수정하면 첫 번째 호출은 "I am Base"를, 두 번째 호출은 "I am child"를 출력한다.
void cast(Base& x) { cout<< x.msg << endl; }
결론
값에 의한 전달은 객체 복사와 암시적 형변환의 위험이 있다.
참조에 의한 전달은 이것을 방지하지만, 객체를 수정 가능하다. 필요에 따라 객체 수정을 불가능하게 하려면 const
참조로 명시적으로 전달해주는 것이 좋다.
출처
266가지 문제로 정복하는 코딩 인터뷰 in C++ by 아드난 아지즈
728x90