this 포인터
멤버 함수의 공유
C++에서 하나의 클래스에서 생성된 인스턴스는 각각 독립된 메모리 공간에 저장된 자신만의 멤버 변수를 가지지만, 멤버 함수는 모든 인스턴스가 공유합니다.
따라서 Book 클래스를 이용해 두 개의 인스턴스를 생성해도, TickerBook()이라는 멤버 함수는 하나만이 존재합니다.
즉, 더 두꺼운 책의 이름을 출력해 주는 TickerBook() 멤버 함수는 두 인스턴스가 같이 공유하게 됩니다.
ThickerBook() 멤버 함수의 정의는 다음과 같습니다.
정의
const Book& Book::ThickerBook(const Book& comp_book)
{
if (comp_book.total_page_ > total_page_)
{
return comp_book;
}
else
{
return ???; // 자신을 호출한 인스턴스를 반환하는데 알 수가 없음.
}
}
그리고 ThickerBook() 멤버 함수는 다음과 같이 호출될 것입니다.
예제
web_book.ThickerBook(html_book);
이때 ThickerBook() 멤버 함수는 자신을 호출한 객체가 web_book 객체임을 인수를 통해 전달받아야만 합니다.
그래야만 else 문에서의 반환값을 정확히 명시할 수 있기 때문입니다.
this 포인터
위와 같은 이유로 C++에서는 모든 멤버 함수가 자신만의 this 포인터를 가지고 있습니다.
이 this 포인터는 해당 멤버 함수를 호출한 객체를 가리키게 되며, 호출된 멤버 함수의 숨은 인수로 전달됩니다.
이렇게 하면 호출된 멤버 함수는 자신을 호출한 객체가 무엇인지 정확히 파악할 수 있습니다.
this 포인터를 사용하여 위의 ThickerBook() 멤버 함수를 다시 정의하면 다음과 같습니다.
정의
const Book& Book::ThickerBook(const Book& comp_book)
{
if (comp_book.total_page_ > total_page_)
{
return comp_book;
}
else
{
return *this; // 자신을 호출한 인스턴스를 반환함.
}
}
예제
int main(void)
{
Book web_book("HTML과 CSS", 350);
Book html_book("HTML 레퍼런스", 200);
cout << web_book.ThickerBook(html_book).title_; // 더 두꺼운 책의 이름을 출력함.
return 0;
}
Book::Book(const string& title, int total_page)
{
title_ = title;
total_page_ = total_page;
current_page_ = 0;
set_percent();
}
void Book::set_percent() { percent_ = (double) current_page_ / total_page_ * 100; }
const Book& Book::ThickerBook(const Book& comp_book)
{
if (comp_book.total_page_ > this->total_page_)
{
return comp_book;
}
else
{
return *this;
}
}
실행 결과
HTML과 CSS
this 포인터의 특징
C++에서 this 포인터는 다음과 같은 특징을 가집니다.
1. this 포인터는 클래스, 구조체 또는 열거체 타입의 비정적 멤버 함수에서만 사용할 수 있습니다.
2. 정적(static) 멤버 함수는 this 포인터를 가지지 않습니다.
3. this 포인터는 언제나 포인터 상수이며, 따라서 값을 재할당할 수 없습니다.
C++ 정적 멤버 함수에 대한 더 자세한 사항은 C++ 정적 멤버와 상수 멤버 수업에서 확인할 수 있습니다.