μ°μ°μ μ€λ²λ‘λ©(Operator Overloading)
κΈ°μ‘΄ μ 곡νκ³ μλ μ°μ°μλ₯Ό μ¬μ μνμ¬ μ¬μ©μ μ μ ν΄λμ€λ‘ μ¬μ©νλ κ²μ λ§νλ€.
- μλ‘μ΄ μ°μ°μλ₯Ό μ μν μλ μλ€.
- κΈ°λ³Έ μ 곡 λ°μ΄ν° νμμ μ μ©ν λ μ°μ°μμ μλ―Έλ₯Ό λ€μ μ μν μ μλ€.
- λ©€λ² ν¨μλ‘ μ€λ²λ‘λλ μ°μ°μμ 첫 λ²μ§Έ νλΌλ―Έν°λ νμ μ°μ°μκ° νΈμΆλλ κ°μ²΄μ ν΄λμ€ νμμ΄λ€.
1. ꡬν
κ°μ₯ λ¨μν λ§μ μ°μ°μλ₯Ό μλ‘ κ΅¬νν΄λ³΄μ.
1) λ©€λ² ν¨μ
- p1+p2λ p1.operator+(p2)μ κ°λ€.
- λ©€λ² ν¨μμ μ μ ν¨μκ° λ λ€ κ°μ λ°©μμΌλ‘ μ€λ²λ‘λ© λμ΄μλ€λ©΄ λ©€λ² ν¨μκ° μ°μ μλλ€. νΉμ μλ μ»΄νμΌλ¬μμ μ΄λ° μν©μ μ€λ₯λ₯Ό λ°μμν¬ μ μμΌλ―λ‘ μ¬λ§νλ©΄ λ©€λ² ν¨μλ‘ μ€λ²λ‘λ©νλ κ²μ΄ μ’λ€.
#include <iostream>
using namespace std;
class Product {
int var;
public:
Product() :var(0) {}
Product(int x) : var(x) {}
void print() const { cout << var << "\n"; }
void set(int x) { var = x; }
Product operator+(Product& a) const {
Product b(a.var + var);
return b;
}
};
int main() {
Product a(10);
Product c = a + a;
c.print();
}
2) μ μ ν¨μ
- friend ν€μλλ‘ λ©€λ² λ³μμ λν μ κ·Όμ΄ κ°λ₯νκ² ν΄μΌ νλ€.
- p1+p2λ operator+(p1, p2)μ κ°λ€.
#include <iostream>
using namespace std;
class Product {
int var;
public:
Product() :var(0) {}
Product(int x) : var(x) {}
void print() const { cout << var << "\n"; }
void set(int x) { var = x; }
friend Product operator+(const Product& a, const Product& b);
};
Product operator+(const Product& a, const Product& b) {
return Product(a.var + b.var);
}
int main() {
Product a(10);
Product c = a + a;
c.print();
}
2. λ€μν μ¬μ©
// ==
bool MyString::operator==(MyString& str)
{
return !compare(str);
}
// <<
std::ostream& operator<<(std::ostream& os, const Complex& c)
{
os << "( " << c.real << " , " << c.img << " ) ";
return os;
}
// +
Complex operator+(const Complex& a, const Complex& b)
{
Complex temp(a.real + b.real, a.img + b.img);
return temp;
}
// []
char& MyString::operator[](const int index)
{
return string_content[index];
}
// νλ³ν
operator int() { return 333; }