기본적으로 C++은 함수로부터 객체를 전달받거나 함수에 객체를 전달 할 때 "값에 의한 전달 "

pass-by-value 방식을 사용 한다.( C에서 물려받은 특성중 하나 ) 특별히 다른 방식을 지정하지

않는 한, 함수 매개변수는 실제 인자의 사본을 통해 초기화 되며, 어떤 함수를 호출 한 쪽은

그 함수가 반환하는 값의 사본을 돌려받는다. 이들 사본을 만들어내는 원천이 바로 복사생성자인데

이 점 떄문에 값에 의한 전달이 고비용의 연산이 되기도 한다.

아래 클래스를 보면

class Person

{

public:

Person();

virtual ~Person();

private:

std::string name;

std::string address;

};


class Student : public Person

{

public:

Student();

~Student();

private:

std::string schoolName;

std::string schoolAddress;

};


여기서 아래를 보면 validateStudent라는 함수를 호출하고 있다.

이 함수를 Student 인자를 전달받고(값으로) 이 인자가 유효화 됬는가를 알려주는 값을 반환한다.

bool validateStudent( Student S );        // Student를 값으로 전달받는 함수

Student plato;                         

bool platoIsOk = validateStudent(plato);    // 함수 호출

plato로부터 매개변수 s를 초기화 시키기 위해 Student의 복사 생성자를 호출한다.

게다가 s는 validateStudent가 복귀할 때 소멸될 것이고, 이 함수의 매개변수 전달 비용은

Student의 복사 생성자 호출 한번, Student의 소멸자 호출 한번 이다.


Student객체에는 String 객체 두개가 멤버로 들어 있기 떄문에..Student객체가 생성될 때마다

이들 String 형제도 덩달아 생성되야 한다. 게다가 Student객체는 Person객체로부터

파생되었기 때문에 Student객체가 생성되면 Person객체도 먼저 생성되야 한다.

Person객체 안에는 또 String 객체 두개가 들어 있ㄱ ㅣ때문에 Person 객체가 생성 될 떄마다

String 생성자가 두번 더 불리게 된다.

단지 Student 객체 하나를 값으로 전달 했을 뿐인데 Student 복사 생성자 호출한번,

Person 복사 생성자 호출 한번에 추가로 String 복사 생성자 호출이 네번 일어 난다.

Student 객체의 사본이 소멸될때도 앞에 생성된 생성자들 각각이 소멸자 호출과 대응된다.

Student 객체응 값으로 전달하는데 날아간 비용만 보면 생성자 여섯번에 소멸자 여섯번이다.


이렇게 여러번 거치지 않고 넘어 갈 수 있는 방법이 있다. 그게 바로 상수객체에 대한 참조자

( Reperance - to - const )로 전달하게 만드는 것이다.

bool validateStudent( const Student& s );

이렇게 하면 새로 만들어지는 객체 같은 것이 없기 때문에 생성자와 소멸자를 전혀 호출되지 않는다.

여기서 새겨둬야 할 부분이 매개변수 선언문에 있는 const이다.

원래의 validateStudent는 Student매개변수를 값으로 받도록 되어 있기 때문에, 호출부에서는 함수로

전달된 Student객체에 어떤 변화가 생기더라도 그 변화로부터 안전하게 보호를 받는다는 점을 알고있다. 그도 그럴 것이 validateStudent가 상대하는 Student 객체는 원본이 아닌 사본이니까.

그런데 이제 Student 객체의 전달 방식이 참조에 의한 전달이다.

참조에 의한 전달방식으로 매개변수를 넘기면 복사손실 문제( slicing problem )가 없어지는 장점도

있다. 


※ 값에 의한 전달 보다는 상수 객체 참조자에 의한 전달을 선호하자. 대체적으로 효율 뿐만아니라

복사손실 문제까지 막아준다.

※ 기본제공 타입 및 STL반복자, 그리고 함수 객체 타입에는 맞지 않다. 이들에 대해서는

값에 의한 전달이 더 적절하다