this 포인터
- 멤버 함수 안에서 사용가능한 키워드
- 자신을 호출한 객체의 주소를 담고 있다.
객체를 여러 개 생성 할 때
멤버 데이터는 객체당 한 개씩 메모리에 놓이게 된다.
멤버 함수는 객체의 개수에 상관없이 코드 메모리에 한 개만 있다.
#include <iostream>
class Point
{
int x = 0;
int y = 0;
public:
void set(int a, int b)
{
std::cout << this << std::endl;
x = a;
y = b;
}
};
int main()
{
Point p1;
Point p2;
p1.set(10, 20);
p2.set(30, 40);
std::cout << &p1 << std::endl;
std::cout << &p2 << std::endl;
}
위와 같은 코드에서 p1과 p2 객체가 각각 생성될 때, 아래와 같은 메모리 구조(p1과 p2 각각)가 생성된다.
p1.set(10, 20); 이 호출되었을 때, set 함수는 메모리에 하나 밖에 없는데 앞에 (p1이 써 있지만, 전달되는 인자는 2개 뿐인데) 어떻게 p1과 p2 메모리 위치를 구별할 수 있을까?
-> 실제로는 두 개의 인자뿐아니라 p1의 주소까지 함께 전달이 된다.
-> set(&p1, 10, 20) 과 같은 형태로 불리는 것이다.
-> 눈에는 보이지 않지만 실제 this가 사용된다.
void set (Point* this, int a, int b)
{
this->x = a;
this->y = b;
}
this 포인터 활용
(1) this를 사용하면 멤버에 접근할 수 있다.
- 이름 충돌 시 멤버의 이름과 지역변수(함수인자)의 이름이 동일할 때 지역변수가 우선시 된다.
#include <iostream>
class Point
{
int x = 0;
int y = 0;
public:
//Point* set(int x, int y) // return this;
Point& set(int x, int y)
{
this->x = x;
this->y = y;
return *this;
}
};
int main()
{
Point p1;
//p1.set(10,20)->set(30,40)->set(40,50); // 포인터를 반환하면 "->" 사용가능
p1.set(10,20).set(30,40).set(40,50);
// cout의 원리가 this를 반환하는 방식!
//cout << "A" << "B" << "C";
}
(2) this를 반환하는 함수
- this 또는 *this를 반환하면 멤버 함수를 연속적으로 호출할 수 있다.
- cout 의 원리가 반환값으로 자기 자신을 반환하는 것이다.
주의!
*this를 반환할 때 아래와 같이 Point가 반환값이 되면 임시객체가 생성되기 때문에 참조를 반환해야 한다.
Point set(int x, int y)
{
return *this;
}
this 포인터 주의사항
this pointer가 static member 함수에서는 사용할 수 없다.
static 함수는 객체가 없어도 생성이 되어 있을 수 있기 때문에 this 사용이 불가한 것이다.
#include <iostream>
class Test
{
public:
static void foo()
{
std::cout << this << std::endl;
}
};
int main()
{
// foo()를 호출하는 첫번째 방법
Test::foo();
// foo()를 호출하는 두번째 방법
Test t;
t.foo();
}
main.cpp:8:22: error: ‘this’ is unavailable for static member functions
'C++' 카테고리의 다른 글
[C++] 상속과 생성자 (파생 클래스 구현 방법 및 호출 순서) (0) | 2021.08.26 |
---|---|
[C++] 상속 (Inheritance), protected (0) | 2021.08.25 |
[C++] 상수 멤버 함수 const (1) | 2021.08.23 |
[C++] static member (정적 멤버), static 변수, static 함수 (0) | 2021.08.22 |
[C++] 복사 생성자 (copy constructor), 얕은 복사 (Shallow Copy), 깊은 복사 (deep copy) (0) | 2021.08.21 |
댓글