..

Search

47) this 포인터

47) this 포인터

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; // 자신을 호출한 인스턴스를 반환함.

    }

}

 

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 포인터는 암시적으로도 사용될 수 있지만, 가급적 화살표(->) 연산자를 통해 명시적으로 사용하는 것이 좋습니다.

this 포인터의 특징

C++에서 this 포인터는 다음과 같은 특징을 가집니다.

 

1. this 포인터는 클래스, 구조체 또는 열거체 타입의 비정적 멤버 함수에서만 사용할 수 있습니다.

2. 정적(static) 멤버 함수는 this 포인터를 가지지 않습니다.

3. this 포인터는 언제나 포인터 상수이며, 따라서 값을 재할당할 수 없습니다.

 

C++ 정적 멤버 함수에 대한 더 자세한 사항은 C++ 정적 멤버와 상수 멤버 수업에서 확인할 수 있습니다.

 

C++ 정적 멤버와 상수 멤버 수업 확인 =>


연습문제