*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(자기 참조) 함수를 작성할 때는 꼭 &를 써주어야 한다.
'언어 > C++' 카테고리의 다른 글
[C++] 얕은 복사, 깊은 복사 (0) | 2023.09.25 |
---|---|
[C++] 1. 멤버이니셜라이저(feat. const 변수), 2. 생성자와 소멸자를 이용한 동적할당, 3. this 포인터 (0) | 2023.09.25 |
[C++] 참조자가 객체로 쓰였을 때는? (0) | 2023.09.25 |
[C++] 동적 할당(dynamic allocation) (0) | 2023.09.21 |
[C++] 함수 오버로딩이란? (cf. 함수 오버라이딩) (0) | 2023.09.21 |