|
아돌님 질문을 보면
포인터와 레퍼런스에 대해 혼란을 느끼시는것 같습니다.
처음질문부터 답변하는것보다 핵심적인 소스부터 설명 드리죠
---------------------------------------------------------------------------
: 3 bool BCLCoGnrLmt::readVCLM34T(const IFWVO &vCLM34T)
: {
: VCLM34T &iVO = (VCLM34T &)vCLM34T;
: select_CLM34T_1(&iVO.mv);
: }
---------------------------------------------------------------------------
여기서 함수 매개변수의 readVCLM34T(const IFWVO &vCLM34T) 에서의
"&"는 레퍼런스로 값을 받겠다는 것이고요
: select_CLM34T_1(&iVO.mv);
여기에서는의 "&"는 레퍼런스가 아니라 iVO.mv의 포인터를 나타내는겁니다.
따라서 4번 소스
---------------------------------------------------------------------------
: 4 short select_CLM34T_1( struct rclm34t_type* iCLM34T)
: {
: memcpy(&DCLM34T, iCLM34T, sizeof(DCLM34T));
: select 어쩌구 저쩌구 from 어쩌구;
: }
---------------------------------------------------------------------------
이 소스는 아돌님이 생각하는데로
---------------------------------------------------------------------------
: 아..그리고 그아래에 memcpy부분이요 iCLM34T 를 DCLM34T 로 카피하고있습니다..
: 그런대?무슨이유에서 포인트타입의 iCLM34T를 레퍼런스타입의 DCLM34T 로 넣게
: 된걸까요
---------------------------------------------------------------------------
포인트 타입에서 레퍼런스 타입으로 복사하는게 아니라 둘 다 포인터 타입입니다.
&DCLM34T 은 DCLM34T를 가리키는 포인터이기 때문입니다.
또한 4번 함수에서는 포인터로 받은것은 처음 개발하신분이 함수 내부에서
memcpy를 사용하기 위해 일부러 포인터로 받은 것으로 보이고요
물론 레퍼런스 타입으로 받아서 "&"를 붙여 사용해도 차이는 없을겁니다.
어떻게 사용해도 큰 차이는 없습니다.
"&" 를 사용하는 C문법에서는 변수의 메모리번지를 리턴 하는 기능으로만 사용했었는데..
C++ 문법으로 넘어가면서 레퍼런스 선언이라는 문법이 추가되어 혼란이 되는것 같군요
이것만 확실히 알아두시면 좋을듯...
C++에서 레퍼런스(&)를 사용하는것은 포인터를 보기좋게 사용하기 위한 방법일 뿐입니다.
아돌 님이 쓰신 글 :
: 안녕하세요^^
: 레퍼런스 선언에 대해 선배님들의 답변부탁드릴께요..
:
: 아래는 제가 보는 소스의 일부분을 붙여넣은것입니다..
: 1번소스 함수의 매개변수를 &iPVO로 받구요 이것을 다시 iVS1014S에 넣구요..
: iVS1014S에 들어간값중 일부를 가져와서 각각의 *pInVO와 *pOutVO에 넣었는대요..
: 대충이런식으로 어떤뜻인지는 알겠는대요..저 레퍼런스(&)이거에대해서 잘모르겠어요
:
: 제가 알기론 레퍼런스는 또다른이름을 짓는거라고 들은거같은대..도대체 레퍼런스가
: 무슨역할을하는것이며..무슨뜻인가요?선배님들의 좋은 조언부탁드릴께요..
: 아래의 1번 소스를 예로 설명부탁드림니다..(__)
:
: <1번 소스>
:
: short PS1014S::calcGnrLmt(IFWVO &iPVO)
: {
: VS1014S &iVS1014S = (VS1014S &)iPVO;
: VS1014I *pInVO = iVS1014S.getInVO_1014();
: VS1014O *pOutVO = iVS1014S.getOutVO_1014();
: }
:
:
: 조금만 더 질문드릴께요..^^
:
: 아래 또다른 2번소스가 있습니다..1번에서 iVCLM34T를 선언하고 호출했습니다..
: 2번에서 호출값을 받았습니다 레퍼런스로요..이때 레퍼런스로 받았다면
: 그냥 일반적으로 받는거랑 어떤게 틀린가요?(질문1)
: 그리고 레퍼런스로 받은값을 또다른 레퍼런스 선언한곳인 iVO에 넣었어요..
: 이또한 레퍼런스 선언된변수로 인해 어떤특성이 있는지도 궁금합니다..(질문2)
: 계속해서 레퍼런스로 받았던 vCLM34T를가지고 3번인 readVCLM34T를 호출했습니다..
:
: 3번에서도 2번에서와같이 값을레퍼런스로 받고 또다른레퍼런스에 넣주고..
: 그리고 &iVO.mv를 가지고 호출을 또 합니다..여기서 mv는 클래스 내부에 선언된
: struct입니다..
:
: 이제 4번으로 호출이 됨니다 여기서는 레퍼런스를 넘겨줬는데 포인트로 받았습니다
: 여기서 포인트로 받은이유는 무었일까요?주소값이 포인트로 들어가는건가요?(질문3)
: 왜 레퍼런스만 쓰다가 포인터로 받았을까요..ㅠㅠ 어렵네요..
:
: 아..그리고 그아래에 memcpy부분이요 iCLM34T 를 DCLM34T 로 카피하고있습니다..
: 그런대?무슨이유에서 포인트타입의 iCLM34T를 레퍼런스타입의 DCLM34T 로 넣게
: 된걸까요..이렇게 되면 포인트의 주소가 레퍼런스로 들어가나요?내부적으로
: 어떤일이 이루어지는지 모르겠네요..ㅠㅠ답변부탁드릴께요..(질문4)
:
: <2번 소스>
:
:
: 1 VCLM34T iVCLM34T;
: m_BCLGnrLmt->readVCLM34T(iVCLM34T)
:
: 2 bool BCLGnrLmt::readVCLM34T(const IFWVO &vCLM34T)
: {
: VCLM34T &iVO = (VCLM34T &)vCLM34T;
: m_BCLCoGnrLmt->readVCLM34T(vCLM34T)
: }
:
: 3 bool BCLCoGnrLmt::readVCLM34T(const IFWVO &vCLM34T)
: {
: VCLM34T &iVO = (VCLM34T &)vCLM34T;
: select_CLM34T_1(&iVO.mv);
: }
:
: 4 short select_CLM34T_1( struct rclm34t_type* iCLM34T)
: {
: memcpy(&DCLM34T, iCLM34T, sizeof(DCLM34T));
: select 어쩌구 저쩌구 from 어쩌구;
: }
:
:
: 정말 길어졌네요..ㅠㅠ 근대 알고싶어요..
: 책을 뒤져봐도 잘모르겠구요..인터넷을 뒤져봐도 제가원하는 대답은 없구요..
: 이프로그램은 실제 업무에쓰이는 거에요..소스분석을 해야하는대 어렵네요..
: 정말 알고싶네요..어떤건인지..왜그런건지..무슨뜻인지..
:
: 선배님들..번거로우시겠지만 초보의 입장에서 이해하기 쉽도록 설명부탁드릴께요..
: 1번 소스,2번소스 에대해 답변부탁드림니다..
: 한시라도 빨리 알고싶을뿐이네요..
:
: 감사합니다..(__)
|