본문 바로가기
Language/C++

[c++] <this> pointer 오호...

by 담백로봇 2022. 10. 11.

c++ 에서 많이 보이는 this는 무엇인가. 

This 는 우리가 아는 * 포인터 같이 object의 현재  Memory address를 가르킨다.  그럼 this를 왜써야하는가?

 

1. 첫번쨰 이유로는 각각의 object 들은 각각의 copy된 data member (클래스 안에 변수들) 들을 가지나 모든 오브젝트들은 하나의 copy된 member function(클래스안에 함수들)만 가지게된다. 고로 및에 그림에서 object A가 run() 을 호출하면 object A에 있는 int x 값이 업데이트 되어야하는지 object B의 int x 가 업데이트 되는지 혼란스러운데 이때 *this 포인터가 어디 object에서 호출된것인지 명시해준다. ( 주의사항으로 non static member function에서만 사용되어야한다.)

대략적인 플로우

2. 두번째로는 Chaining method에 사용될수있는데 이는 한번의 코드에 여러개의 함수를 같이 부르는 경우를 뜻한다 . 예를 들어 cout에서 쓰이는데 ((cout << b <<) c )에서 첫번쨰로 b를 부르고 그다음으로 c를 부른데 쓸수있다!.

 

#include<iostream>
using namespace std;
class point
{
  int x,y;
public:
  point(int x, int y)
  {
    this -> x = x;
    this -> y = y;
  }
  point &setX(int x)
  {
    this -> x = x;
    return *this; %% return에 *this 를 써줌으로써 하나의 오브젝트를 지속적으로 불러준다
  }
  point &setY(int y)
  {
    this -> y = y;
    return *this;
  }
};
int main(){
  point p1(5,5);
  p1.setX(10).setY(10); %이게 chaining method
}

3. data member 이름이 member function 의 arument 의 이름에 가려지지 않게해준다. 무슨 말이냐면 this 를 쓰지않을때는 아래에  명시된 x1을 써줘서 중복되지않게 해줘야하는데 this를 씀으로써 불필요한 변수명을 줄일 수 있다.\

 

#include<iostream>
using namespace std;

class point{
  int x,y; % data member

public:
  point(int x1, int y1){
    x = x1;
    y = y1;
  }
};

int main(){

  point p1(5,5),p2(10,10);
  
}

                                                                                 < this 가없을떄>

#include<iostream>
using namespace std;

class point{
  int x,y;

public:
  point(int x, int y){
    this -> x = x;
    this -> y = y;
  }
};

int main(){
  point p1(5,5),p2(10,10);
}

                                                                             <this가 있을때>

 

오케이 항상 궁금해 하던건데 이해하려고 수고했다. 써먹어보면서 체화시켜야지~.

댓글