-
참조와 포인터(2)@ 16. 1 ~ 17. 1/C++ 2013. 2. 13. 22:47
클래스를 그대로 함수에 전달하면 복사본이 만들어진다는 것은 기본 중에 기본
포인터나 참조를 이용하면 훨씬 좋다.
하지만 그냥 전달시 복사본이 생성되어 값이 변경되지 않지만..
포인터나 참조를 이용하면 값이 변경된다. 그래서
int sum(const T *t){ ... }
이런식으로 const를 선언한다.
그런데 위험물인 포인터말고..참조로 바꿔보자..
int sum(const T &t) { .... }
호출시에는
int r=sum(t);
int와 float이외 클래스를 함수에 전달할 때는 대개 참조를 사용한다고 한다?
우와..편하다..!! !!
근데 문제점이있단다..?
참조 문제점
int r=sum(t); 를 보자..
이게 과연..그냥 객체를 넣은것인지..참조형태로 넣은것인지...이것만 보고 누가 알 수 있을까..?
혹..함수의 매개변수 받는 것이..
int sum(const T &t); 라면 변경될일이 없어 안심이긴 하다..
근데 이게 바로 문제다. "변경될 가능성이 있는지의 유무를 호출하는 쪽 코드만 봐서는 알 수 없다"
뭐..함수 헤더를 보고 const가 있는지 확인하면 되긴하는데..언제 다 확인을 해야하나..
만약 포인터라면..
int r=sum(&t);
이런 형식을 보고.."아.. 여기서 내용이 변경되었을지도 모르겠구나.."라고 판단은 할 수 있다. 근데 참조는 아니다.
"값이 변경될 때는 포인터를 건네고 변경되지 않을 때는 참조를 사용한다"라는 규칙으로 한다.
이 규칙을 철저하게 지키면 &가 붙으면 내용이 변경되는 함수라는 것을 알 수 있고 그대로 전달하면 const가 붙은 참조이므로 안전하다는 것을
알 수 있다. (게임프로그레밍의 정석)
지역참조 반환은 헛수고
T &foo()
{
T a;
return a;
}
함수 안에서 만든 지역변수를 참조반환한다. 하지만 함수가 종료되는 시점에서 a는 소멸이 된다..
'@ 16. 1 ~ 17. 1 > C++' 카테고리의 다른 글
369숫자를 찾아 *로 표시하기 (0) 2013.02.18 역삼각형 *모양 출력 (0) 2013.02.16 참조와 포인터(1) (0) 2013.02.13 분할컴파일시..extern, static (0) 2013.02.12 포인터 정리(4) (0) 2013.01.31