ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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