C++/열혈 C++ 프로그래밍(윤성우 저)

열혈 C++ 프로그래밍 10-1 문제

꾸준함. 2017. 6. 8. 18:15

[1번 문제]

/*

Point 클래스에 대해서 다음 조건을 만족하는 형태로 -연산자를 오버로딩 해보자

1.전역함수 기반으로 오버로딩

2.멤버 -연산의 결과를 담은 Point 객체 반환

*/

#include <iostream>

using namespace std;

 

class Point

{

private:

        int xpos;

        int ypos;

public:

        Point(int x = 0, int y = 0) :xpos(x), ypos(y)

        {

        }

        void ShowPosition() const

        {

               cout << '[' << xpos << ", " << ypos << ']' << endl;

        }

        friend Point operator-(const Point &pos1, const Point &pos2); //전역함수 기반

        Point &operator-=(const Point &ref) //멤버 -연산의 결과를 담은 Point 객체 반환

        {

               xpos -= ref.xpos;

               ypos -= ref.ypos;

               return *this;

        }

};

 

Point operator-(const Point &pos1, const Point &pos2)

{

        Point pos(pos1.xpos - pos2.xpos, pos1.ypos - pos2.ypos);

        return pos;

}

 

int main(void)

{

        Point pos1(10, 20);

        Point pos2(3, 4);

        Point pos3 = pos1 - pos2;

 

        pos1.ShowPosition();

        pos2.ShowPosition();

        pos3.ShowPosition();

        (pos1 -= pos2).ShowPosition();

        return 0;

}


[2번 문제]

/*

Point 클래스에 대해서 다음 조건을 만족하는 형태로 +=연산자와 -=연산자를 오버로딩 해보자

1.멤버함수 기반으로 오버로딩

2.연산 'pos1+=pos2' 결과로 pos1 멤버변수 값이 pos2 멤버변수 값만큼 멤버 증가

3.연산 'pos1-=pos2' 결과로 pos1 멤버변수 값이 pos2 멤버변수 값만큼 멤버 감소

4.연산의 결과롤 값이 증가 감소한 pos1 객체를 반환하도록(이왕이면 참조형으로 반환하도록) 연산자 오버로딩

*/

#include <iostream>

using namespace std;

 

class Point

{

private:

        int xpos;

        int ypos;

public:

        Point(int x = 0, int y = 0) :xpos(x), ypos(y)

        {

        }

        void ShowPosition() const

        {

               cout << '[' << xpos << ", " << ypos << ']' << endl;

        }

        Point &operator+=(const Point &ref) //멤버함수 기반 +=

        {

               xpos += ref.xpos; //조건 2

               ypos += ref.ypos;

               return *this; //조건 4

        }

        Point &operator-=(const Point &ref) //멤버함수 기반 -=

        {

               xpos -= ref.xpos; //조건 3

               ypos -= ref.ypos;

               return *this; //조건 4

        }

};

 

int main(void)

{

        Point pos1(10, 20);

        Point pos2(3, 4);

       

        pos1.ShowPosition();

        pos2.ShowPosition();

        (pos1 += pos2).ShowPosition();

        (pos1 -= pos2).ShowPosition(); //pos1+pos2 상태에서 pos2 감소시키므로 pos1 값이 같다

        return 0;

}


[3번 문제]

/*

Point 클래스에 대해서 다음 조건을 만족하는 형태로 == 연산자와 !=연산자를 오버로딩 해보자

1. 전역함수의 형태로 오버로딩

2.연산 'pos1==pos2' 결과로 모든 멤버의 값이 같다면 true, 그렇지 않다면 false 반환

3.연산 'pos1!=pos2' 결과로 모든 멤버의 값이 같다면 false, 그렇지 않다면 true 반환

4.연산자 == 먼저 오버로딩 다음에, 이름 이용하는 형태로 !=연산자를 오버로딩

*/

#include <iostream>

using namespace std;

 

class Point

{

private:

        int xpos;

        int ypos;

public:

        Point(int x = 0, int y = 0) :xpos(x), ypos(y)

        {

        }

        void ShowPosition()

        {

               cout << '[' << xpos << ", " << ypos << ']' << endl;

        }

        friend bool operator==(const Point &pos1, const Point &pos2); //조건 1

        friend bool operator!=(const Point &pos1, const Point &pos2); //조건 1

};

 

bool operator==(const Point &pos1, const Point &pos2) //조건 2

{

        if (pos1.xpos == pos2.xpos&&pos1.ypos == pos2.ypos)

        {

               return true;

        }

        else

               return false;

}

 

bool operator!=(const Point &pos1, const Point &pos2) //조건 3

{

        if (pos1==pos2) //조건 4

               return false;

        else

               return true;

}

 

int main(void)

{

        Point pos1 = { 10, 20 };

        Point pos2 = { 3, 4 };

 

        pos1.ShowPosition();

        pos2.ShowPosition();

        if (pos1 == pos2)

               cout << "pos1 pos2 동일하다" << endl;

        if (pos1 != pos2)

               cout << "pos1 pos2 다르다" << endl;

        return 0;

}



개발 환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 열혈 C++ 프로그래밍 윤성우 저

반응형