-
항목 20 : 값에 의한 전달 보다는 상수객체 참조자에 의한 전달방식을 택하는 편이 낫다@ 16. 1 ~ 17. 1/Effective C++ 2013. 8. 19. 22:06
기본적으로 C++는 함수로부터 객체를 전달받거나 함수에 객체를 전달할 때 값에 의한 전달(pass by value)방식을 사용한다.
특별히 다른 방식을 지정하지 않으면 함수 매개변수는 실제 인자의 사본을 통해 초기화되며, 어떤 함수를 호출한 쪽은 그 함수가
반환한 값의 사본을 돌려받는다.
이들 사본을 만들어내는 원천이 바로 복사생성자라고 한다. 그래서 값에 의한 전달이 고비용의 연산이 된다고 한다.
그래서 고비용을 없애기 위해 상수객체에 대한 참조자로 전달하게 만드는것이다.
void 함수(매개변수 : const 객체명& a);
이렇게 하면 새로 만들어지는 객체 같은 것이 없다. 여기서 새겨둬야 할 부분은 매개변수 선언문에 있는 const이다.
원래의 값에 의한 전달이라면
void 함수(매개변수 : 객체명 a); 인데 함수로 전달된 객체명 a에 어떤 변화가 생겨도 그 변화로부터 원본은 안전하게 보호를 받는다.
그런데 참조자의 의한 전달은 객체가 변할지도 모른다는 걱정때문에 const를 붙여야한다.
추가로 참조에 의한 전달 방식이라면 매개변수를 넘기는 복사손실 문제가 없어진다.
주로 파생클래스 객체가 기본 클래스 객체로서 전달되는 경우에 드물지 않게 발생이된다.(아래 예문 참고)
결론적으로
객체의 타입이 기본제공 타입일 경우에는(int 등) 참조자로 넘기는 경우보다 값으로 넘기는 편이 더 효율적일때가 많다
#include<iostream> #include<conio.h> using namespace std; class Person{ public: Person(){} ~Person(){} virtual void Show() const{ cout << "Person" << endl; } private: string name; string address; }; class Student : public Person{ public: Student(){} ~Student(){} virtual void Show() const{ cout << "Student"<<endl; } private: string schoolName; string schoolAddress; }; void Print(Person s){ cout << "Print" << endl; s.Show(); } void Print(const Person& s, int num){ cout << "Print & " << endl; s.Show(); } int main() { Student s; ⁄⁄파생클래스 Print(s); ⁄⁄결과는 기본클래스 cout << endl; Print(s,1); ⁄⁄결과는 파생클래스 getch(); return 0; }
'@ 16. 1 ~ 17. 1 > Effective C++' 카테고리의 다른 글
항목 7:가상 소멸자 (0) 2015.01.14 항목6 : 복사생성자 및 대입연산자 제한 (0) 2015.01.14 항목 37 : 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자 (0) 2014.06.02 항목 33 : 상속된 이름을 숨기는 일은 피하자 (0) 2014.06.01 항목4 : 객체를 사용하기 전에 반드시 그 객체를 초기화하자 (0) 2013.08.25