-
[C++] this 포인터C++ 2019. 8. 29. 22:46
this 포인터란?
호출된 인스턴스 자신의 메모리 주소를 가리키는 포인터, 클래스의 내부에서 인스턴스들의 구분을 위해서 사용된다.
123456789101112131415161718192021222324252627#include <iostream>using namespace std;class Simple{private:int m_id;public:Simple(int id){setID(id);cout << "생성자에서 출력한 자신의 주소 : " << this << endl;}void setID(int id) { m_id = id; }int getID() { return m_id; }};int main(){Simple s1(1);cout << "s1의 주소 : " << &s1 << endl;Simple s2(2);cout << "s2의 주소 : " << &s2 << endl;}cs this 포인터의 필요성
각각이 별개로 구분되어야 하는 인스턴스들과 달리 클래스의 멤버 함수는 인스턴스마다 가지고 있는 것이 아니라 하나만 생성되어 인스턴스들끼리 공유해서 사용하는 것이 효율적이다.
멤버 함수를 공유해서 사용하려면 어떤 인스턴스가 멤버 함수를 호출했는지 구분할 수 있어야 하는데 이때 사용되는 것이 this 포인터이다.
물론 평소에는 생략되어 있어 this 포인터를 사용하고 있는 것처럼 보이지는 않지만, 내부적으로는 this를 사용해서 클래스 내부의 멤버들을 처리한다. 아래의 코드를 보자.
1234567891011121314151617181920212223242526#include <iostream>using namespace std;class Simple{private:int m_id;public:Simple(int id){this->setID(id); // this 명시;}void setID(int id) { this->m_id = id; } // this 명시int getID() { return this->m_id; } // this 명시};int main(){Simple s1(1);s1.setID(3); // 내부적으로는 Simple::setID(&s1, 3)와 같이 동작cout << s1.getID() << endl;}cs main()함수의 s1.setID(3);라는 부분도 내부적으로는 Simple::setID라는 함수를 하나만 생성 해두고 이를 호출할 때 인스턴스의 주소와 함수의 인자를 넣어 인스턴스들을 구분할 수 있는 형태로 처리된다.
이 외에도 this 포인터는 멤버 변수와 인자의 이름이 같을 때 구분하기 위해서 사용하기도 하고, *this를 리턴해서 멤버 함수를 연쇄 호출 하는 목적으로 사용하기도 한다.
참고 자료
https://www.inflearn.com/course/following-c-plus/lecture/14739 (인프런, 홍정모의 따라배우는 C++(8.7 this 포인터와 연쇄 호출))
'C++' 카테고리의 다른 글
C++ 반복자(iterator), vector와 list의 반복자 비교 (0) 2021.10.18 [C++] 증감 연산자 오버로딩(전위 연산자, 후위 연산자) (0) 2019.09.04 [C++] 함수 포인터 (0) 2019.08.27 [C++] Tuple (복수의 값 반환) (1) 2019.08.22 [C++] const 위치에 따른 포인터의 의미 (0) 2019.07.18