-
[C++] 반환형 참조형 (return값이 참조형일때)C++ 2023. 4. 15. 20:30
[함수의 return 값이 참조자일때]
return 값이 참조자여도
return type이 참조형일 수도 있고 참조형이 아닐 수 도 있다
즉, 참조자를 return 한다고 return type이 참조형이여야만 하는 것은 아니다!
참조형이 아니여도 된다. 그리고 이에 따른 결과가 다르다
이해해도 이 문장 읽을때마다 ㅈㄴ 헷갈림
그래서 별도로 정리해놓는다...
일단 알아야할건 다음과 같다
매개변수로 선언된 참조자는 지역변수와 동일한 성격을 갖는다.
즉, 매개변수 참조자를 반환하면 참조자는 소멸된다.
하지만 참조자는 그저 어떤 변수에 대한 참조자일뿐, 그 자체로 변수는 아니기 때문에
참조자가 참조하는 변수는 소멸되지 않는다.
// int num = 10 전달했다고 가정 int& func1(int& ref) { ref++; return ref; }
이 함수가 반환하면 참조자 ref 만 소멸되지 변수 num 자체가 소멸되지는 않는다
[반환형이 참조자여도 반환값을 무엇으로 저장하느냐에 따라 결과에 차이가 있다]
1. 반환형 참조형 / l-value 참조형
int& func(int& ref){ ref++; return ref; } int main(){ int num = 10; int& ret = func(num); }
이건 참조자를 참조형으로 반환
그리고 그 참조형을 받는게 참조형
이러면 ref는 num의 참조정보를 반환하고(반환type이 참조형이므로)
지역변수 참조자이므로 소멸된다
해당 반환을 받은 ret 은 num의 참조자가 된다.
하지만
2. 반환형 참조형 / l-value 참조형 x
int& func(int& ref){ ref++; return ref; } int main(){ int num = 10; int ret = func(num); }
이걸 이렇게 그냥 기본자료형 ( 참조형이 아닌거 ) 로 받아버리면
이때는 func의 반환값이 상수(해당 참조자가 참조하는 대상의 값 value )
즉, ret은 num과 다르다.
새로운 메모리공간이 할당되고 그 변수는 ret
그리고 거기에 func(num)에서 참조형으로 넘긴 참조자가 참조하는 값이 상수로 대입되는 것이다
알아듣겠는가? 내일이면 나도 이해안갈듯 ㅇㅇ...
( 다행이도 이틀뒤인 지금 이해가 가고 있다r... )
3. 반환형 참조형X / l-value는 무조건 참조형X
참조자를 참조형X로 return 할때
l-value는 무조건 참조형이면 안된다.
참조자를 반환하는데 타입이 참조형이 아닐때의 반환값은
해당 참조자가 참조하는 변수의 값, value 그 자체이기 때문이다!!
참조자는 이미 공간이 할당된 변수에 얹혀지는건데
변수가 아닌 그냥 상수(value)만 들어오면 에러다
[참조자 반환시 주의할 것]
1. 함수 내 지역변수를 참조자로 전달하지 말것
어차피 해당 함수가 끝나면 해당 지역변수는 소멸되기 때문
2. 참조자 return 시 return-type 과 r-value를 신경쓸 것
[객체를 참조형으로 반환할때]
l-value가 참조형이면 이건 r-value 가 반환해준 객체에 참조자를 얹히겠다는 뜻
l-value가 참조형이 아니면 이건 r-value가 참조형이여도 새로운 공간에 메모리 할당하고 해당 참조자가 참조하는 객체의 값을 대입한다.
즉, 이땐 참조값(상수)로 r-value가 해석된다.
'C++' 카테고리의 다른 글
[C++] default parameter (1) 2023.04.19 [C++] MyString 클래스 실습 (0) 2023.04.13 [C++] const (1) 2023.04.12 [C++] 접근지정자 (access modifiers) (3) 2023.04.11 [C++] friend (2) 2023.04.11