c++에서 함수의 *인자와 &인자 차이는 뭔가요?
글쓴이: dalili / 작성시간: 화, 2009/09/01 - 1:20오후
c++ 에서 보니까 c하고 문법이 좀 다른것 같아서요
const Complex operator +(const Complex &T) const {
Complex R;
R.image = image + T.image;
R.real = real + T.real;
return R;
}
Complex operator +(const Complex *T) const {
Complex R;
R.image = image + T->image;
R.real = real + T->real;
return R;
}
두 함수 차이가 있나요?
Forums:
C랑 똑같으면 C++이
C랑 똑같으면 C++이 존재하는 이유가 없겠지요. 그외에도 다른점 많으니 C++계속 써야 한다면, C++ 입문서 한번 훑어 보시는게 좋습니다.
이것만 알면된다면 "C++ 레퍼런스 연산자" 또는 "C++ 레퍼런스 변수" 등으로 찾아보세요.
찾아봤는데 요점이 이거군요
포인터 변수(*)와의 차이점
포인터는 자체 메모리 공간을 가지지만 레퍼런스는 자체 메모리 공간 없음
그런데 컴퓨터 입장에서 레퍼런스는 메모리 주소공간 4byte가 없이 처리 할 수 있다는게 궁금하군요
레퍼런스도 컴파일러
레퍼런스도 컴파일러 내부적으로는 포인터를 이용하여 구현됩니다.
단순히 언제 레퍼런스 사용하고, 언제 포인터 쓰면 좋은지라던가 둘의 차이점을 알고 싶으시면
More effective C++라는 책의 "항목 1 : 포인터와 참조자를 구분하자"를 읽어보시기 바랍니다.
http://ikpil.com/348 -> 이렇게 정리해놓은 블로그도 있지만, 직접 예문과 함께 읽어보시는게
오해 없이 확실히 이해가 가실겁니다.
그게 아니고 C++을 공부하시는 중이라면 입문서 하나 사셔서 첨부터 차근차근 읽어보심이
좋을것 같습니다. "난 C는 아니까, C++이 C랑 다른 점만 찾아서 봐야지.."는 생각보다 힘듭니다.
C++이 C를 기본으로 하는것은 맞지만, 훨신 더 복잡하고 많은 개념을 포함하고 있어서.. 체계적으로
입문서 정독하시기를 추천합니다. ^^
http://wiki.kldp.org/wiki.php/superwisdom
레퍼런스는
레퍼런스는 포인터처럼 프로그래머가 일일이 메모리 관리를 할 필요가 없습니다.
대신 Call depth 가 깊어질수록 레퍼런스 카운터란걸 내부적으로 증가시키고,
나중에 리턴할때마다 감소시켜서 레퍼런스 카운터가 0가 되면 변수를 릴리즈하죠.
포인터처럼 아무데나 보내고, 리턴하고 하는 식으로 쓸 수는 없지만,
레퍼런스를 자주 써 버릇을 하면, 효율적인 메모리 관리에 잇점이 많아요.
(제가 아는 한 미국 분은 포인터를 하나도 안쓰는 프로그래밍에 치중하더군요
그렇게 하니깐 사실 코드의 가독성은 아주 좋아집니다.
하지만, 포인터 하나 안쓰고 프로그래밍 한다는게 저한텐 너무 어려웠어요)
vio:
'레퍼런스 변수'와
'레퍼런스 변수'와 '레퍼런스 카운팅'은 전혀 상관없는 이야기입니다.
레퍼런스 변수가 존재하고 안하고와, 가리키는 변수가 할당되고 해제되는 것에는 전혀 관계가 없습니다.
레퍼런스도 포인터처럼 아무데나 보내고 리턴하는 식으로 쓸수 있습니다.
레퍼런스 카운팅은 boost::shared_ptr 과 같은 스마트 포인터에서, 자동화된 메모리관리를 위해 이용되는 기법입니다.
그래요?
죄송합니다. 제가 잘못 설명했군요. (한참 C++을 안썼더니 이젠 다 헷갈리네요)
혼돈을 없애기 위해 다시 설명해야겠네요.
xylosper님 설명처럼 reference variable과 reference counting은 말만 비슷하지 상관없습니다.
reference counting은 garbage collection에 쓰이는 기술이죠.
제가 boost library는 안써봐서 모르겠네요.
아마 자바의 변수처럼 garbage collection을 해 주는 것 같군요.
(참고로 저의 설명은 자바 레퍼런스 변수에 해당되는 것 같습니다)
레퍼런스 변수는 반드시 존재하는 Object을 참고해야 합니다.
(즉, nickname 이라고 생각할 수 있겠죠)
또한, 포인터처럼 de-referencing 할 필요가 없습니다.
그러므로 call by reference 를 구현할때 사용이 간편한 장점이 있습니다.
이런 이유로 C++ 의 operator overloading은 매개변수와 리턴형 모두 레퍼런스를 사용합니다.
PS> xylosper님 지적 감사합니다.
댓글 달기