[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++ 프로그래밍 윤성우 저
'C++ > 열혈 C++ 프로그래밍(윤성우 저)' 카테고리의 다른 글
열혈 C++ 프로그래밍 10-3 문제 (0) | 2017.06.08 |
---|---|
열혈 C++ 프로그래밍 10-2 문제 (0) | 2017.06.08 |
OOP 단계별 프로젝트 7 (0) | 2017.06.08 |
OOP 단계별 프로젝트 6 (0) | 2017.06.06 |
열혈 C++ 프로그래밍 8-1 문제 (0) | 2017.06.06 |