:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/12/16 18:58
기능상으론 static변수와 같은 역할을 한다고 보시면 됩니다.
원래 주소값으로 하는 연산이 아니면 function이 끝나는 순간 내부 변수내용은 모두 사라지게 됩니다. 하지만 저 함수는 리턴을하고 함수가 끝나도 함수 a에서 선언된 abc란 주소는 여전히 남아있게 되고 다시 함수를 호출하면 저 값이 증가됩니다. (인수로 보내는값과 참조하여 사용한 함수 a의 변수 abc 둘다 증가) 함수로 보내실때 인수는 int& abc로 보내셔야 될겁니다.
08/12/16 19:48
레퍼런스 반환은 보통 저렇게 사용 안하죠.
C에서는 함수의 리턴값은 모두 R-value인데 c++로 확장되면서 레퍼런스 반환으로 리턴값이 L-value가 될 수도 있습니다. 이게 무슨말이나 하면 a(1)=3; //이건 c에서는 명백한 에러지만 int &a(int abc) //이렇게 레퍼런스 반환형이라면 L-value로 쓰일수 있습니다. 아래주소에서 퍼온 예제입니다. http://web.lge.cn:8000/system/cpp/1062 #include<iostream.h> #include<iomanip.h> #include<conio.h> int & max(int & x, int & y) return (x > y)? x: y; void main() int a=10,b=20,z; clrscr(); z=max(a, b); // z=20이 된다. cout << "z= " << z << endl; max(a, b)=0; // b=0이 된다. a의 값(10)은 변화 없다. cout << "a= " << a << endl; cout << "b= " << b << endl; getch(); EZrock님// static과는 다릅니다. 아래 예제를 실행해보시면 둘다 stack에 할당된 것을 확인 하실 수 있습니다. #include <cstdlib> #include <iostream> using namespace std; int &a(int abc) static int st; cout<<&st<<endl; //2 함수의 정적(static)변수 abc++; cout<<&abc<<endl; //3 함수의 지역변수 return abc; int main(int argc, char *argv[]) int asd; cout<<&asd<<endl; //1 main함수의 스택(지역)변수 cout<<&a(1)<<endl; //4 리턴된 지역변수 system("PAUSE"); return EXIT_SUCCESS; 출력결과입니다. 0x22ff74 0x443020 0x22ff50 0x22ff50
08/12/16 20:31
으...머리가 더 어지럽네요...
그니까 int abc() 함수랑 int &abc() 함수는 똑같이 int 값을 리턴하는데 저 &를 붙이면 뭐가 달라지느냐는 건데요... 처음꺼는 그냥 int값이 반환하는건 알겠는데... 나중 것은 int값에 &를 붙여서 반환되는 건가요..?? int &abc(int &a) ........... return a; // a가 10이라고 하면... 요건 a에 &를 붙여서 반환하는 건가요? 즉 &a 이렇게 말입니다. 그렇다면 a의 주소값을 반환한다는 건데.... 레퍼런스 함수가 이걸 의미하는건 아니지 않습니까? int z = abc(a); 일때 abc함수가 a를 반환하면 z = &a 이렇게 되는거는 아닌것 같은데요.. 이걸 도대체 어떻게 생각해야 하는건지 모르겠습니다.
08/12/16 20:51
Magic_'Love'님// 간단하게 정리하면 레퍼런스 리턴은
abc(a)=0; 이런 코드 때문에 쓰는 겁니다. int z = abc(a); 이런 형태에서는 레퍼런스 리턴은 필요가 없습니다. 전체코드를 보여주셔야 알겠지만 제시하신 코드는 잘못 작성한 코드 같네요. ps. local변수는 함수 밖에서 레퍼런스하거나 포인팅하면 안됩니다. return후에 다른 함수가 호출되면 값이 덮어쓰기 됩니다.
08/12/16 21:49
Memex님// 질문을 잘못한것 같아서...
제가 궁금한건 레퍼런스 반환 함수 <======= 이놈의 개념 그 자체입니다. 즉 int abc() int a; ....... return a; 이건 아무런 문제가 없습니다. 근데 int &abc() int a; ....... return a; 이렇게 함수 반환형에 &가 붙으면 이걸 어떻게 이해해야 하느냐는 것 입니다. 그냥 int반환형 함수면 a = 25 일때 a를 리턴하면 함수를 호출한곳에 25를 넘겨주겠죠.. 그런데 int&반환형 함수에 a = 25 일때 a를 리턴하면 함수를 호출한곳에 25를 넘겨주는건지 &a가 되어서 a의 주소값을 주는건지 아니면 어떤 작용이 일어나는건지.... 이걸 모르겠습니다. 레퍼런스 반환함수라고 하는데.... 그 레퍼런스 반환함수가 뭘 하는 놈인지 모르겠다는 것입니다. 레퍼런스 반환이라는 개념 그 자체를 모르겠습니다....ㅜ.ㅡ;;;
08/12/16 22:20
return 3;
이러면 3이 리턴됩니다. return a; 하면 보통 a의 값이 리턴됩니다. 하지만 int &func(); 이렇게 함수를 레퍼런스 리턴형으로 하면 return a; 하면 a라는 변수 자체가 리턴됩니다. 레퍼런스라는 개념은 포인터와 비슷합니다. 포인터는 포인터 변수가 메모리주소라는 값을 갖고 그 메모리를 통해서 변수를 제어합니다. 레퍼런스 변수는 레퍼런스 변수 자체가 참조 당하는 변수와 같은 주소 공간을 공유합니다. 레퍼런스 리턴이나 값의 리턴이나 개념적으로 비슷하지만 값의 리턴은 R-value로만 사용되지만 레퍼런스 리턴은 L-value로도 사용가능합니다.(L-vaule는 =연산자에서 왼쪽에 위치하는게 L-value입니다. 오른쪽은 R-value입니다. L-value는 변수, R-value는 변수나 상수가 가능합니다.) 일반적인 return은 변수의 값을 리턴합니다. 하지만 레퍼런스 리턴은 변수 자체를 리턴하기 때문에 변수를 직접 제어할 수 있습니다. 포인터 리턴으로 동일하게 구현하려면 리턴된값에 *(value of)를 넣어 주면됩니다. int &abc() int a; ....... return a; 이 함수는 a라는 변수의 레퍼런스를 만들어서 그걸 리턴하는 기능을 하게 됩니다. 포인터식으로 바꾸자면 int *abc() int a; ....... return &a; 가 됩니다. 사용할 때는 위의 코드는 abc()=123; 아래의 코드는 *abc()=123 물론 저렇게 지역변수를 포이팅하거나 레퍼런스 하는 것은 매우 안좋은 코딩입니다. 리턴되는 시점에 값은 그대로 남아 있지만 이미 스택영역 밖의 데이터가 됩니다.
08/12/16 22:27
Memex님// 그렇다면 레퍼런스 반환 함수를 사용하는 이유가 L-value로 쓰기 위해서 인가요..??
즉 R-Value로 쓰일때는 굳이 레퍼런스 반환함수로 할 필요가 없지만 L-value로 쓰기 위해 레퍼런스 반환 함수가 존재하는 것인가요?
08/12/16 23:40
Memex님// 아...네...;; 뭔가 알듯말듯 하네요...크
하여튼 대답해 주셔서 감사합니다. 다른 분들도 답변해 주셔서 감사합니다...
08/12/17 14:42
어지간해서는 레퍼런스 반환 함수를 쓸 필요는 없을것 같습니다.
저도 과제하면서 혹은 프로젝트하는 친구들의 내용물을 봐도 저런걸 쓰는 사람은 한번도 본적이 없는데 레퍼런스로 보내주기만 하면 리턴받을 필요 없이 조작이 다 되는데...저런식의 함수를 쓸 필요가 있을까 싶은 생각이 드네요. 그래서 저는 쓰지 않습니다-_-)乃
|