C++_OOP3


オブジェクトポインタ


オブジェクトのアドレス値を格納する変数で、オブジェクトを間接的に参照します.
#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

リファレンスコール

&タグにより、実パラメータの別名に形式パラメータが付与され、同じメモリが使用される.
オブジェクトの結果値を返すには、返す値のタイプと関数の戻りタイプを一致させるだけです.関数結果を返すと、保存結果値に個別のメモリが割り当てられます.(=戻り値はcallby 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
関数の戻り値をreference形式で処理する場合は、関数の結果値を格納するためにメモリを別途割り当てる必要はありません.(=reference呼び出しによる戻り値)
mp 1=&pt 1=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;
}