언어 공부/C++

6. 오버로딩(Overloading)

LTSGOD 2023. 1. 14. 11:31

함수 오버로딩

  • 함수의 이름은 동일
  • 매개변수의 type, 갯수가 다름
  • return type은 관계없음

연산자 오버로딩

  • C++ 은 다양한 연산자 오버로딩 가능
  • >>, << 구현의 경우 friend 키워드를 통해 구현 가능(멤버함수로 불가)

friend

  • 다른 클래스나 함수가 나의 private 또는 protected 멤버에 접근할 수 있게 허용
//<<, >>멤버함수 불가, 외부함수에만 구현 가능, 항상 참조변수써야함
class Complex {
private:
	double re, im;
public:
	Complex(double r) { re = r; im = 0; }
	Complex(double r = 0, double i = 0) : re(r), im(i){}
	void Output() { cout << re << " + " << im << "i" << endl; }
	Complex& operator+=(Complex);
	Complex& operator-();
	friend Complex operator+(Complex& v1, Complex& v2);
	friend Complex operator++(Complex& v1);//전위 연산자
	friend Complex operator++(Complex& v1, int x);//후위 연산자
	friend ostream& operator<<(ostream& os, Complex& v1);
	friend istream& operator>>(istream& is, Complex& v1);
};

Complex& Complex::operator+=(Complex v) {
	this->re += v.re;
	this->im += v.im;
	return *this;
}

Complex& Complex::operator-() {
	this->re = -re;
	this->im = -im;
	return  *this;
}

Complex operator+(Complex& v1, Complex& v2) {

	Complex tmp;
	tmp.re = v1.re + v2.re;
	tmp.im = v1.im + v2.im;
	return tmp;
}

Complex operator++(Complex& v1) {
	return Complex(++v1.re, ++v1.im);
}

Complex operator++(Complex& v1, int x) {
	Complex tmp = v1;
	v1.re++;
	v1.im++;
	return tmp;
}

ostream& operator<<(ostream& os, Complex& v1) {

	os << "(" << v1.re << " + " << v1.im << "i)" << endl;

	return os;
}

istream& operator>>(istream& is, Complex& v1) {
	is >> v1.re >> v1.im;
	return is;
}