this포인터 c,c++ 프로그래밍

메모리가 잡혔을때의 자기자신의 주소값이 this포인터이다.

클래스 내부에 함수포인터를 호출할때와 부득이하게 리턴값(콜바이레퍼런스)으로 사용할때 this포인터를 사용한다.

그외에는 namespace를 사용하는게 안전하다.

class C_TEST
{
private:
int nData;
public:
void setData(int nData);
void printPointer();
};
void C_TEST::printPointer()
{
printf("%d\n", this);
}
void C_TEST::setData(int nData)
{
this->nData = nData;          //this로 멤버를 알려준다.
C_TEST::nData = nData;        //namespace를 사용하여 구분
}

int _tmain(int argc, _TCHAR* argv[])
{
C_TEST cTest;
cTest.printPointer();
return 0;
}

위와같이 namespace를 사용하여 구분짓는방법이 안전하다

operator를 재구현할때 

C_TEST c_Test1;
C_TEST c_Test2;
C_TEST c_Test3;
c_Test3 = c_Test2 = c_Test1;

위와 같은 연산을 가능하게 제공되는 구조는 리턴값을 레퍼런스로 하는 구조이다.
하지만 리턴값을 레퍼런스로 하기위해서 자기자신인 c_test2의 이름을 함수내에서 얻어올 방법이 없기 때문에 *this를 이용해서 리턴값을 알려준다. 

C_TEST& C_TEST::operator = (C_TEST &cData)
{
m_nData = cData.m_nData;
return *this;
}

레퍼런스의 문법중
int *p = NULL;
int &nNum = *p;
가 가능하다. 이를 이용해서 *this를 리턴값으로 사용할수있다.

/////////////////////////////////////////////////////////////////////

class C_TEST
{
private:
int m_nData;
public:
C_TEST();
void setData(int nData);
void printData();
C_TEST& operator = (C_TEST &cData);
C_TEST& operator = (int nData);
};

int _tmain(int argc, _TCHAR* argv[])
{
C_TEST c_Test1;
C_TEST c_Test2;
C_TEST c_Test3;

c_Test1.setData(100);

c_Test3 = c_Test2 = c_Test1;

c_Test1.printData();
c_Test2.printData();
c_Test3.printData();

c_Test3 = c_Test2 = c_Test1 = 10000;

c_Test1.printData();
c_Test2.printData();
c_Test3.printData();

return 0;
}

C_TEST::C_TEST():
m_nData(0)
{

}
void C_TEST::setData(int nData)
{
m_nData = nData;
}
void C_TEST::printData()
{
printf("%d\n", m_nData);
}

C_TEST& C_TEST::operator = (C_TEST &cData)
{
m_nData = cData.m_nData;
return *this;
}

C_TEST& C_TEST::operator = (int nData)
{
m_nData = nData;
return *this;
}


덧글

댓글 입력 영역