C++에서, 펑터의 리턴 타입으로 pointer와 reference간 선택의 문제 좀 도와 주세요
글쓴이: parkon / 작성시간: 수, 2009/12/16 - 7:25오후
펑터라는 개념도 별로 없어 겨우 겨우 하는 수준인데요, 이 펑터의 리턴 타입에 대해서 궁금해서요.
제가 하려고 하는게,
어떤 클래스가 있고, 멤버 함수 중에서 functor를 리턴하는 녀석이 있습니다.
예를 들어
class F1 {
double operator()(double);
...
}
class MyCLASS {
private:
F1 *f1;
public:
F1 *GetF1(int);
...
}
F1* MyCLASS::GetF1(int a) {
...
f1=new F1;
...
return f1;
}그럼 메인 루틴은
{
MyCLASS *a= new MyCLASS(...);
...
F1 *f= a->GetF1(123);
double x,y;
x=3.2;
y= (*f)(x);
...
}뭐 대충 이런 식인데요,
여기에서 123은 펑터에 들어가는 적당한 파라미터이고, F1은 펑터 클래스이고요.
현재 위와 같이 작성해서 그럭 저럭 잘 돌아 가고 있습니다.
근데,
이렇게 구현된 녀석에서, MyCLASS::GetF1이, 펑터 포인터가 아닌 펑터 레퍼런스를 반환하도록 하는게 어떨까 하고
같이 일하는 사람에게 물었더니,
즉 저 위의 루틴을,
F1 &f=a->GetF1(123); x=3.2; y=f(x);
이렇게 되도록요,
그 사람 왈 const reference 를 쓸거냐, non-const reference를 쓸거냐,
그 둘에 실행 속도에서 차이가 많이 난다...는 식의 답변을 받았는데,
const reference를 쓴다는 말이, 저 위의 식을
const F1 &f=a->GetF1(123); ...
이렇게 구현한다는 뜻일까나요 ?
아님, GetF1을
const F1& MyCLASS::GetF1(int a) {
...
f1=new F1;
...
return *f1;
}포인터를 반환하는 경우에 비해 non-const reference와 const reference를 반환하게 하는 경우의
실행 속도도 궁금하고요.
혹시 이런 내용에 대해 잘 설명된 웹 사이트 알려 주시면 고맙겠습니다.
Forums:


Modern C++ Design 을
Modern C++ Design 을 보시면 궁금해 하고 계신 것과 더 좀 생각해봐야 하는 문제에 대한 해답을 보실 수 있습니다.
bugiii님, 답변
bugiii님, 답변 고맙습니다.
디자인 패턴은 공부해 본 적도 없고 책도 하나도 없는데
말씀하신 책 구해서 한번 읽어봐야 겠습니다.
포인터와 레퍼런스의 차이에 대한 이해
포인터를 리턴하는 것과 레퍼런스를 리턴하는 것에 속도의 차이가 없습니다.
레퍼런스는 포인터처럼 pointer arithmatic이 없고 단지 메모리의 상에 이미 할당된 객체의 별명(alias)이죠.
두 개의 가장 큰 차이는 포인터는 *(p + 0x1111) = x 이런 표현으로 편리하지만 자칫 잘못하면 프로세스를 죽여버릴 수 있는 강력함이 있는 반면, 레퍼런스는 이미 정상적으로 할당된 객체를 alias할 수 밖에 없으므로 제한되지만 안전하게 사용할 수 있고 코드 상으로도 깔끔한 표현이 가능하다는 장점이 있습니다.
다른 책에는 포인터와 레퍼런스를 톱과 손톱깎기로 비유하기도 합니다. 적절한 경우에 알아서 쓰라고..
Life rushes on, we are distracted
Life rushes on, we are distracted