C++_OOP3

gimmicks_u·2022년 3월 31일
0

C++

목록 보기
3/5
post-thumbnail

객체 포인터

객체의 주소값을 저장하기 위한 변수로, 객체를 간접 참조하기 위해 사용한다.

#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 포인터

객체가 함수를 호출할때는 어떤 객체가 호출한지 알 수 있지만, 함수 입장에서는 누가 나를 호출한지 모른다. 누가 나를 호출했는지 알아야 할 상황에 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;
}

전달인자가 객체인 함수

값 전달 방식(복사)과 레퍼런스 전달 방식(주소값)이 있다.

값 전달 방식(Call by value)

기본 자료형을 값 전달 방식으로 사용한 것처럼, 객체도 값 전달 방식으로 전달이 가능하다. 실 매개변수와 형식 매개변수의 메모리 관리가 별도로 이루어진다.

#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 reference)

&표시를 통해 실매개변수의 별칭을 형식 매개변수에 부여해서 같은 메모리를 사용하게한다.

객채의 결과값을 반환하려면 반환하려는 값의 타입과 함수의 반환 타입을 일치시켜주면 된다. 함수 결과 반환 시 결과값을 저장하기 위한 별도의 메모리가 할당된다. (= 반환값은 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;
}
profile
Done is better than perfect

0개의 댓글