객체의 주소값을 저장하기 위한 변수로, 객체를 간접 참조하기 위해 사용한다.
#include <iostream>
using namespace std;
// 클래스 정의
class MousePoint
{
private : // 외부에서 접근하지 못하게 함
int x, y;
public :
void SetXY(int nX, int nY);
MousePoint(); // 디폴트 생성자
MousePoint(int nX, int nY); // 생성자
~MousePoint(); // 소멸자
// private한 x,y값을 출력
int GetX(){return x;}
int GetY(){return y;}
};
// 멤버함수 구현
void MousePoint::SetXY(int nX, int nY)
{
x = nX;
y = nY;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
}
MousePoint::MousePoint() // 디폴트 생성자
{
cout << "생성자 호출" << endl;
x = 10;
y = 20;
}
MousePoint::MousePoint(int nX, int nY) // 생성자
{
x = nX;
y = nY;
}
MousePoint::~MousePoint() // 소멸자
{
cout << "소멸자 호출" << endl;
}
// 객체 생성
int main()
{
MousePoint pt(10,20);
MousePoint *pObj;
pObj = &pt;
cout << pt.GetX() << endl;
cout << pt.GetY() << endl;
cout << pObj->GetX() << endl;
cout << pObj->GetY() << endl;
}
10
20
10
20
소멸자 호출
->
: 간접 참조 연산자.
객체가 함수를 호출할때는 어떤 객체가 호출한지 알 수 있지만, 함수 입장에서는 누가 나를 호출한지 모른다. 누가 나를 호출했는지 알아야 할 상황에 this
포인터를 사용한다.
// 1
void MousePoint::SetXY(int nX, int nY)
{
x = nX;
y = nY;
}
// 2
void MousePoint::SetXY(int X, int Y)
{
this -> x = x;
this -> y = y;
}
값 전달 방식(복사)과 레퍼런스 전달 방식(주소값)이 있다.
기본 자료형을 값 전달 방식으로 사용한 것처럼, 객체도 값 전달 방식으로 전달이 가능하다. 실 매개변수와 형식 매개변수의 메모리 관리가 별도로 이루어진다.
#include <iostream>
using namespace std;
// 클래스 정의
class MousePoint
{
private : // 외부에서 접근하지 못하게 함
int x, y;
public :
void SetXY(int nX, int nY);
MousePoint(); // 디폴트 생성자
MousePoint(int nX, int nY); // 생성자
~MousePoint(); // 소멸자
// private한 x,y값을 출력
int GetX()
{
return this -> x;
}
int GetY()
{
return this -> y;
}
};
// 멤버함수 구현
void MousePoint::SetXY(int nX, int nY)
{
x = nX;
y = nY;
}
MousePoint::MousePoint() // 디폴트 생성자
{
cout << "생성자 호출" << endl;
x = 10;
y = 20;
}
MousePoint::MousePoint(int nX, int nY) // 생성자
{
x = nX;
y = nY;
}
MousePoint::~MousePoint() // 소멸자
{
// cout << "소멸자 호출" << endl;
}
void SetRect(MousePoint pt1, MousePoint pt2) // call by value
{
cout << "pt1.GetX : " << pt1.GetX() << endl;
cout << "pt1.GetX : " << pt1.GetY() << endl;
pt1.SetXY(1000, 2000);
cout << "pt1.GetX : " << pt1.GetX() << endl;
cout << "pt1.GetX : " << pt1.GetY() << endl;
}
void CopyObject(MousePoint pt1, MousePoint pt2)
{
pt1 = pt2;
cout <<"pt1.GetX() : " << pt1.GetX() << endl;
cout <<"pt1.GetY() : " << pt1.GetY() << endl;
}
// 객체 생성
int main()
{
MousePoint mp1(10, 20);
MousePoint mp2(100, 200);
cout <<"mp1.GetX() : " << mp1.GetX() << endl;
cout <<"mp1.GetY() : " << mp1.GetY() << endl;
CopyObject(mp1, mp2);
cout <<"mp1.GetX() : " << mp1.GetX() << endl;
cout <<"mp1.GetY() : " << mp1.GetY() << endl;
}
mp1.GetX() : 10
mp1.GetY() : 20
pt1.GetX() : 100
pt1.GetY() : 200
mp1.GetX() : 10
mp1.GetY() : 20
&
표시를 통해 실매개변수의 별칭을 형식 매개변수에 부여해서 같은 메모리를 사용하게한다.
객채의 결과값을 반환하려면 반환하려는 값의 타입과 함수의 반환 타입을 일치시켜주면 된다. 함수 결과 반환 시 결과값을 저장하기 위한 별도의 메모리가 할당된다. (= 반환값은 call by value)
---중복코드---
void CopyObject(MousePoint &pt1, MousePoint &pt2)
{
pt1 = pt2;
cout << "pt1.GetX() : " << pt1.GetX() << endl;
cout << "pt1.GetY() : " << pt1.GetY() << endl;
}
// 객체 생성
int main()
{
MousePoint mp1(10, 20);
MousePoint mp2(100, 200);
cout << "mp1.GetX() : " << mp1.GetX() << endl;
cout << "mp1.GetY() : " << mp1.GetY() << endl;
CopyObject(mp1, mp2);
cout << "mp1.GetX() : " << mp1.GetX() << endl;
cout << "mp1.GetY() : " << mp1.GetY() << endl;
}
mp1.GetX() : 10
mp1.GetY() : 20
pt1.GetX() : 100
pt1.GetY() : 200
mp1.GetX() : 100
mp1.GetY() : 200
함수의 반환값을 레퍼런스 형식으로 처리하면 함수의 결과값을 저장하기 위한 메모리를 따로 할당할 필요가 없다. (= 반환값까지 call by reference)
mp1 = &pt1 = CopyObject() 모두 같은 메모리
MousePoint& CopyObject(MousePoint &pt1, MousePoint &pt2)
{
pt1 = pt2;
cout << "pt1.GetX() : " << pt1.GetX() << endl;
cout << "pt1.GetY() : " << pt1.GetY() << endl;
return pt1;
}
// 객체 생성
int main()
{
MousePoint mp1(10, 20);
MousePoint mp2(100, 200);
cout << "mp1.GetX() : " << mp1.GetX() << endl;
cout << "mp1.GetY() : " << mp1.GetY() << endl;
MousePoint ap1 = CopyObject(mp1, mp2);
cout << "mp1.GetX() : " << mp1.GetX() << endl;
cout << "mp1.GetY() : " << mp1.GetY() << endl;
cout << "ap1.GetX() : " << ap1.GetX() << endl;
cout << "ap1.GetY() : " << ap1.GetY() << endl;
}