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함수가 시작되고 나서, 각각 객체의 메모리 주소가 뜨는 것을 확인할 수 있습니다.