본문 바로가기
Language/C++ & openGL

C++ operator+ 연산자 오버로드(operator overloading) ,friend ostream& operator / friend istream& operator (스트림)

by javapp 자바앱 2019. 1. 16.
728x90

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;

}




댓글