두 개의 Power 객체를 더하는 + 연산자를 Power 클래스의 operator+() 멤버 함수로 작성하라.
[실행 결과]
kick=3, punch=5
kick=4, punch=6
kick=7, punch=11
1. Power 클래스 안에 멤버함수로 연산자 함수가 선언되어있다.
2. 객체의 멤버 변수의 값을 각각 더하는 연산이다.
3. 리턴 타입은 Power 클래스인 것 같다.
4. 값을 또 다른 객체에 저장한다.
Power operator+ (Power op2);
Power Power::operator+(Power op2) {
Power tmp;
tmp.kick = this->kick + op2.kick;
tmp.punch = this->punch + op2.punch;
return tmp;
}
int main() {
...
Power c;
c = a + b;
}
#include <iostream>
using namespace std;
class Power {
int kick, punch;
public:
Power(int kick=0, int punch=0) {this->kick=kick; this->punch=punch;}
void set(int kick, int punch) {this->kick=kick; this->punch=punch;}
void show();
Power operator+ (Power op2);
};
Power Power::operator+(Power op2) {
Power tmp;
tmp.kick = this->kick + op2.kick;
tmp.punch = this->punch + op2.punch;
return tmp;
}
void Power::show() {
cout << "kick=" <<kick << ", " << "punch=" << punch << endl;
}
int main() {
Power a, b, c;
a.set(3,5);
b.set(4, 6);
c = a + b;
a.show();
b.show();
c.show();
return 0;
}
두 개의 Power 객체를 비교하는 == 연산자를 클래스의 operator==() 멤버 함수로 작성하라.
1. 작성할 연산자 함수는 Power 객체의 멤버함수이다.
2. operator==()의 매개변수는 Power클래스의 객체이다.
3. 객체의 멤버함수를 각각 비교한다.
4. 모두 같으면 true를 리턴한다. 리턴타입은 'bool'이다.
리턴타입 operator 연산자 (매개변수리스트)
bool operator == (Power op2);
class Power {
...
public:
...
bool operator == (Power op2);
};
bool Power::operator==(Power op2) {
if ((kick == op2.kick) && (punch == op2.punch))
return true;
else return false;
}
[실행결과]
kick=3,punch=5
kick=3,punch=5
두 파워가 같다.
#include <iostream>
using namespace std;
class Power {
int kick, punch;
public:
Power(int kick=0,int punch=0) {this->kick=kick, thist->punch=punch;}
void show();
bool operator == (Power op2);
};
void Power::show() {
cout << "kick=" << kick << "," << "punch=" << punch << endl;
}
bool Power::operator==(Power op2) {
if(kick==op2.kick && punch==op2.punch)
return true;
else return false;
}
int main() {
Power op1(3,5), op2(3,5);
op1.show();
op2.show();
if (op1==op2)
cout << "두 파워가 같다." << endl;
else
cout << "두 파워가 같지 않다." << endl;
}
두 개의 Power 객체를 더하는 += 연산자를 Power 클래스의 operator+=() 멤버 함수로 작성하라.
#include <iostream>
using namespace std;
class Power {
int kick;
int punch;
public:
Power(int kick=0, int punch=0) {
this->kick=kick, this->punch=punch;
}
void show();
Power& operator+= (Power op2);
};
void Power::show() {
cout << "kick=" << kick << ',' << "punch=" << punch << endl;
}
Power& Power::operator+=(Power op2) {
kick = kick + op2.kick;
punch = punch + op2.punch;
return *this;
}
int main() {
Power a(3,5), b(4,6), c;
a.show();
b.show();
c = a+= b;
a.show();
b.show();
}
실행결과
kick=3,punch=5
kick=4,punch=6
kick=7,punch=11
kick=7,punch=11
연산자 함수 선언
+= 연산자의 리턴 타입을 무엇으로 선언해야 할까? += 연산이 사용되는 사례를 보자.
(a += b) += b; // a += b를 계산한 결과 a에 다시 += b가 계산됨
이 문장을 (a+=b) 연산이 먼저 실행되어 b가 a에 더해진다. 그리고 더해진 a에 += b 연산이 실행된다. 만일 처음 (a+=b) 연산에서 += 연산자 함수가 객체 a를 리턴한다면 리턴된 객체는 a의 복사본이다. 그러면 그 다음에 실행되는 += b 연산은 원본객체 a가 아닌 복사본에 b를 더하게 되는 문제가 발생한다. 이 문제를 해결하기 위해서는 (a+=b) 연산이 객체 a의 참조를 리턴하면 된다. 그러므로 += 연산자의 리턴 타입은 Power&으로 해야 한다.
이제 연산자 함수를 만들어 보자. 컴파일러는 a+=b;의 식을 다음과 같이 변형하며
a. += (b);
Power 객체 a의 operator+=() 함수를 호출하고 객체 b를 매개 변수로 넘긴다. 이에 적절한 operator+=() 연산자 함수는 [그림 7-4]와 같다.
#include <iostream>
using namespace std;
class Power {
int kick, punch;
public:
Power(int kick=0, int punch=0) {this->kick = kick; this->punch = punch;}
void set(int kick, int punch) {this->kick = kick; this->punch = punch;}
void show() {cout << "kick=" << kick << "," << "punch=" << punch << endl;}
Power& operator += (Power op2);
};
Power& Power::operator += (Power op2) {
this->kick += op2.kick;
this->punch += op2.punch;
return *this;
}
int main() {
Power a(3,5), b(4,6);
a.show();
b.show();
Power c;
c = a += b; //c = a.+=(b)와 같은 느낌.
a.show();
c.show();
}