언어/C++

[C++] *this가 반환 값일 때, 함수의 반환형에 &를 쓰는 이유 (+ this와 *this의 차이)

study_memo 2023. 9. 24. 23:44

*this가 반환값으로 나오는 경우가 있는데, 그럴 때는 함수를 선언할 때 어떻게 함수의 반환형을 써주어야 하는걸까?

 

(참고로 this에 *이 붙는 이유는 *이 붙지않으면 this의 주소값이 나오기 때문이다. this의 값을 나오게 하고 싶으면 this 앞에 *을 써주어야 한다. 즉, this는 자기 자신의 주소값이고, *this는 자기자신의 값이다.

 

밑에 두 코드를 보면,  모두

*this가 반환값으로 나오는 경우에는 함수의 반환형에 &를 붙인다는 것을 알 수 있다. 

 

const Book& Book::ThickerBook(const Book& comp_book)
{
    if (comp_book.total_page_ > total_page_)
    {
        return comp_book;
    }
    else
    {
        return *this; // 자신을 호출한 인스턴스를 반환함.
    }
}

 

#include <iostream>
using namespace std;

class SelfRef
{
private :
	int num;
public:
	SelfRef(int n) : num(n)
	{
		cout<<"객체생성"<<endl;
	}

	SelfRef& Adder(int n)
	{
		num+=n;
		return *this;
	}
	SelfRef& ShowTwoNumber() 
	{
		cout<<num<<endl;
		return *this;
	}
};

int main(void)
{
	SelfRef obj(3);
	SelfRef &ref=obj.Adder(2); //참조자는 상수를 받을 수 없다. 그러므로 함수 Adder에서 반환형을 참조자로 써야한다.
	
	obj.ShowTwoNumber();
	ref.ShowTwoNumber();
	
	ref.Adder(1).ShowTwoNumber().Adder(2).ShowTwoNumber();
	return 0;
}

그런데 왜 &를 붙이는걸까? 

 

그냥 &를 안 붙이고 반환형을 그냥 써도 되지않나? 

(왜냐하면 *this는 어떻게보면 자기를 참조하는 포인터이니까, 반환형도 자기자신을 그대로 반환한다고 생각하면 &를 붙이지 않아도 되지 않나?  )   <- 잘못된 생각이다!!

 

<이유1>

참고로 this포인터는 자기참조 포인터이다. 우리는 여기서 반환값이 *this인 것에 주목해야한다.

애초에 this포인터가 자기를 참조하는 포인터이기 때문에 함수 반환형에 &를 붙이는 것이 맞다.

 

<이유2>

*this를 반환할 때 함수 반환형에 &를 쓰지 않는다면

ex)

//잘못된 코드
Point set(int x, int y){
	return *this;
}

//옳은 코드
Point& set(int x, int y){
	return *this;
}

Point가 반환값이 되면서 임시객체가 생성되기 때문에 참조를 반환해야 한다!

 

따라서 self-reference(자기 참조) 함수를 작성할 때는 꼭 &를 써주어야 한다.