1. 값에 의한 전달
class Person{
public:
Person();
virtual ~person(); // 다형성을 가진 기본클래스는 소멸자를 가상소멸자로 한다.. 7장참조
// 객체 해제시 안되는 경우가 있기때문.
private:
string name;
string address;
};
class Student : Person {
public:
Student();
~Student();
private:
string name;
string address;
};
bool validate(Student s);
Student plato;
bool platoIsOk = validate(plato); // 값에 의한 전달 방식
* 예제풀이.
(1) 매개변수 s를 plato로 초기화하기 위해 Student의 복사생성자 호출 1번 -> 총1회
(2) Student의 멤버데이터인 string 2개의 생성자 호출 1회씩 -> 총2회
(3) Student의 기본클래스인 Person에서 먼저 생성되어야 하므로 {(1) + (2)} * 2 -> 총 6회
(4) 소멸자도 생성자에 대응하여 총 6회
* 총 생성자 6회, 소멸자6회 - > 고비용이 발생한다. -> 상수객체의 참조 전달로 해결하자
2. 상수객체 참조에 의한전달
bool validate(const Student& s); // 상수객체 참조에 의한 전달
* 예제 풀이.
(1) 생성자 및 소멸자 미 호출
(2) 호출된 객체가 변하지않음을 보장한다.(const)
3. 참조 전달로 인한 복사손실문제 해소
* 파생클래스 객체가 기본클래스 객체로서 전달되는경우 생각해보자.(값으로 전달할 경우)
-> 기본클래스만의 특징이되는 멤버들이 싹둑 잘려나갈것이다.
-> 하지만, 참조 전달로 이 문제를 해소할 수 있다.
4. 참조자 세부사항
(1) 참조자는 보통 포인터를 써서 구현된다. (컴파일러 동작에서 확인 가능)
(2) 기본 제공타입중 일부는 값에 의한 전달이 효율적이다. (크기가 포인터보다 작기때문)
(3) 하지만, 무작정 사이즈가 작다고 값에 의한 전달이 좋은 건 아니다.
1) 포인터를 값으로 전달할때, 포인터가 가리키는 대상까지 복사하는 비용이 들 수 있기 때문
5. 값에의한전달이 더 효율적인 경우
(1) 기본제공 타입
(2) STL 반복자
(3) 함수 객체 타입
요약정리
(1) 값에 의한 전달보다 참조에 의한 전달을 선호하자. 효율뿐만아니라 복사손실도 막는다.
(2) 위 5번 항목(값에 의한 전달이 더 효율적인경우)도 새겨두자.
'책 정리 > Effective C++ 3rd' 카테고리의 다른 글
항목 22. 데이터 멤버가 선언될 곳은 private 영역임을 명심하자 (0) | 2020.01.09 |
---|---|
항목 21. 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 들지 말자 (0) | 2020.01.08 |
항목 19. 클래스 설계는 타입 설계와 똑같이 취급하자 (0) | 2020.01.07 |
항목 18. 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자 (0) | 2020.01.07 |
항목 17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자 (0) | 2020.01.02 |
댓글