。공부 。

<C++> THIS 포인터

kyoe 2007. 12. 3. 22:34
THIS포인터란 자기자신의 포인터값(주소값) 또는 자기참조 포인터라 부른다.

* This 포인터 예제 *
class kyoe{
    public:
        kyoe *GetThis(){
            return this;
        }
};

int main(void){
    cout<<"p1의 정보"<<endl;
    kyoe *p1 = new kyoe();
    cout<<"포인터 p1: "<<p1<<endl;
    cout<<"p1의 this: "<<p1->GetThis()<<endl;

    cout<<"p2의 정보"<<endl;
    kyoe *p2 = new kyoe();
    cout<<"포인터 p2: "<<p2<<endl;
    cout<<"p2의 this: "<<p2->GetThis()<<endl;   // '(*p).GetThis()' 같은 의미이다.
    return 0;
}
- 실행 결과 -
p1의 정보
포인터 p1: 0x10
p1의 this: 0x10

p2의 정보
포인터 p2: 0x20
p2의 this: 0x20

위의 예제를 실행 시키면 포인터 p1의값과 리턴되어 돌아온 this값이 일치하는것을 알수있다.
두번째 객체인 p2의 주소값을 출력하고 다시 리턴되어온 this값을 보면 먼저실행된 this값과 틀린것을볼수있다 이렇듯 this는 자기자신을 가르키는 포인터값을 갖는다.(객체에따라 값이 달라지는것을 보면 쉽게이해가 간다)

* 두번째 예제 *
class kyoe{                
    int aaa;                  //0x10 의  aaa멤버변수
    int bbb;
    public:
        kyoe(int aaa,int bbb){
            //aaa = aaa;    
            this->aaa=aaa;      //0x10의 멤버변수 aaa = aaa;
            this->bbb=bbb;
        }
        void ShowData(){
            cout<<aaa<<" "<<bbb<<endl;
        }
};

int main(void){
    kyoe Good(100,200);   //Good라는 객체가 0x10이라는 주소에 생성됐다고 가정하자.
    Good.ShowData();
    return 0;
}

예제에서 aaa = aaa; 라는 부분이 있는데 이와 같이 코딩하면 멤버변수 aaa값에 데이터를 초기화하지 못하고 매개변수(지역변수)인 aaa에 또다시 같은값은 넣는 꼴이 되는것이다. 이렇게되면 초기화라는 의미가 없는것이 된다. 멤버변수에 접근하기 위해서 멤버변수의 이름을 매개변수의 이름과 달리해서 하는 방법도 있지만 this포인터를 이용해서 멤버변수에 접근할수도 있다.
this->aaa = aaa; 이와같이 코딩하면 this->aaa는 멤버변수 aaa를 가르키기때문에 멤버변수를 초기화할수있는것이다.