1. operator overloading
객체간의 연산을 위한 기능
연산자 오버로드(operator overloading) 이라고 한다.
경우 1) 인수가 한 개
리턴 값의 형 operator 연산자(인수);
Complex operator+(Complex c); //이항 연산자를 멤버 함수로 오버로드
연산결과 +연산자의 왼쪽변수 오른쪽 변수
Complex Complex::operator+(Complex c); //코드
{
Complex com(0,0);
com.real = real + c.real;
com.imag = imag + c.imag;
return com;
}
경우 2) 인수가 두 개
friend 리턴 값의 형 operator 연산자 (인수1, 인수2);
friend Complex operator+ (int c1, Complex c2);
Complex operator+(int c1, Complex c2)
{
...
}
프렌드 함수는 특별히 해당 클래스에 특별히 접근할 수 있는 함수
멤버 함수가 아니므로 Complex ::를 붙이지 않는다.
2. 단항 연산자 오버로드
리턴 값의 형 operator연산자();
Complex operator++(); //전위
Complex operator++(int n); //후위
};
Complex Complex :: operator++() //전위(대입전 증가)
{
real++; imag++;
return *this;
}
Complex Complex :: operator++(int n) //후위(대입후 증가)
{
Complex c = *this;
real++; imag++;
return c;
}
스트림(stream)
3. 삽입 연산자 오버로드
class Complex{
friend ostream& operator<<(ostream& os, const Complex& v);
friend istream& operator>>(istream& is, Complex& c);
};
ostream& operator<<(ostream& os, const Complex& v) //계산 결과 << 연산자 오버로드
{
os << v.real << "." << v.imag << endl;
return os;
}
istream& operator>>(istream& is, Complex& c)
{
cout << "숫자 입력: ";
is >> c.x;
cout << "숫자 입력: ";
is >> c.y;
return is;
}
int main()
{
Complex com(100, 200);
cout << com; //객체에 <<연산자를 사용할 수 있다.
cin >> com; //객체에 >>연산자를 사용할 수 있다.
cout <<com;
}
구현 Code
#include <iostream>
using namespace std;
class Complex
{
private:
double real, imag;
public:
Complex(double r, double i);
friend ostream& operator<<(ostream& os, const Complex& v);
friend istream& operator>>(istream& is, Complex& c);
Complex operator++();
Complex operator++(int n);
Complex operator+(Complex c);
Complex operator-(Complex c);
void display(){
cout << "(" << real << ", " << imag << ")" << endl;
}
};
Complex :: Complex(double r, double i) : real(r), imag(i)
{
real = r;
imag = i;
}
ostream& operator<<(ostream& os, const Complex& v) //계산 결과 << 연산자 오버로드
{
os << v.real << "." << v.imag << endl;
return os;
}
istream& operator>>(istream& is, Complex& c)
{
cout << "숫자 입력: ";
is >> c.real;
cout << endl;
cout << "숫자 입력: ";
is >> c.imag;
cout << endl;
return is;
}
Complex Complex :: operator++() //전위(대입전 증가)
{
real++; imag++;
return *this;
}
Complex Complex ::operator++(int n) //후위(대입후 증가)
{
Complex c = *this;
real++; imag++;
return c;
}
Complex Complex::operator+(Complex c)
{
Complex com(0,0);
com.real = real + c.real;
com.imag = imag + c.imag;
return com;
}
Complex Complex::operator-(Complex c)
{
Complex com(0, 0);
com.real = real - c.real;
com.imag = imag - c.imag;
return com;
}
int main()
{
Complex com(100, 200);
Complex com2(10, 20);
cout << com; //객체에 <<연산자를 사용할 수 있습니다.
com.display();
cin >> com;
cout << com;
com.display();
cout <<"객체 + 연산(10.20)" << endl;
com = com + com2;
cout << com;
cout << "객체 - 연산(10.20)" << endl;
com = com - com2;
cout << com;
cout << endl;
cout << "전위 증가";
++com2;
cout << com2;
cout << endl;
cout << "후위 증가";
com2++;
cout << com2;
return 0;
}
댓글