About C++ – “this포인터”

About C++ – “this포인터”

11월 13, 2021

this포인터

#include <iostream>
using std::cout;

class Dog{
  private:
    int age;
  public:
    Dog(int a){this->age=a;}
    ~Dog(){cout<<"소멸";} int getAge();
  void setAge(int a);
};

int Dog::getAge() {
return this->age; } // ???
void Dog::setAge(int a)
{this->age=a; } // ???

int main()
{
  Dog happy(5);
  cout<<happy.getAge();
  return 0;
}

4줄부터 10줄까지의 코드는 모두 이해할 수 있으실 것입니다. Dog 클래스를 정의하는 것입니다. 생성자의 매개변수로 멤버변수를 초기화했고, 소멸자도 따로 정의한 것을 볼 수 있습니다.

그런데 14번줄부터 등장하는 this라는 키워드는 무엇일까요? 그것은 this포인터인데, 자동적으로 시스템이 만들어 주는 포인터입니다.

  • 멤버가 호출될 때, 그 멤버가 속한 객체를 가르킵니다.
  • 객체를 통하여 멤버를 호출할 때, 컴파일러는 객체의 주소를 this포인터에 넣은 다음 멤버를 호출합니다.
  • this포인터는 멤버를 호출한 객체의 const포인터입니다.
  • 멤버함수에서 볼 때, this포인터는 어떤 객체가 자신을 호출했는지 알고자 하는 경우 사용합니다.
  • 연산자 중첩에서 사용합니다.
  • 클래스의 멤버함수 내에서 다른 클래스에 자기 자신을 매개변수로 넘길 때에 사용합니다.
int Dog::getAge()
{
    return this->age;
}
void Dog::setAge(int a)
{
    this->age=a;
}

그렇다면 위의 코드를 이해할 수 있을 것입니다. return this->age는 이 객체의 age멤버변수를 가리키는 것입니다.

#include <iostream>
using std::cout;
using std::endl;

class Dog{
  private:
    int age;
  public:
    Dog(int a);
    ~Dog();
  int getAge();
  void setAge(int a);
};

Dog::Dog(int a) // 생성자 정의
{ 
  age=a;
  cout<<this<<endl;
}

Dog::~Dog() // 소멸자 정의
{
  cout<<"소멸";
}

int Dog::getAge(){
  return age;
}

void Dog::setAge(int a){
  age=a;
}

int main()
{
  Dog happy(5),meri(3);
  cout<<"happy 나이 : "<<happy.getAge();
  cout<<"\n";
  cout<<"meri 나이 : "<<meri.getAge();
  cout<<"\n";
  return 0;
}

//0x7ffcda320e08
//0x7ffcda320e00
//happy 나이 : 5
//meri 나이 : 3
//소멸소멸 

위의 예제코드를 살펴보면, 객체가 생성되는 순간 그 객체의 포인터를 출력하게 되도록 생성자를 정의했습니다. 그렇기 때문에 main함수가 시작되고 나서, 각각 객체의 메모리 주소가 뜨는 것을 확인할 수 있습니다.

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.