Chap 10. 연산자의 오버로딩 1
10-1.연산자 오버로딩의 이해와 유형
연산자 오버로딩이란 cpp 내에서 사용할 수 있는 연산자를 객체들 간에서도 사용할 수 있도록 하는 것이다.
가령, Point pos1 = pos2 + pos3; 와 같은 형태로 객체 간의 덧셈에 대해서 연산을 규정할 수 있다.
방법은 다음과 같이 멤버함수, 전역함수 두 가지의 방법이 있고 operator연산자 함수를 오버로딩하여 사용하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class Point{ private: int xpos; int ypos; public: Point(int x, int y) :xpos(x),ypos(y){} // 멤버함수 연산자 오버로딩 Point operator+(const Point & pos2){ Point obj(xpos+pos2.xpos, ypos+pos2.ypos); return obj } friend Point operator+(const Point pos1, const Point pos2); }; // 전역함수 연산자 오버로딩 friend Point operator+(const Point & pos1, const Point & pos2){ Point obj(pos1.xpos+pos2.xpos, pos1.yos+pos2.ypos); return obj; } void main(){ Point pos1(1,2); Point pos2(3,4); Point pos3 = pos1+pos2; // pos3 -> (4,6) Point pos4 = pos1.operator+(pos2); // pos1+pos2 와 동일 Point pos5 = operator+(pos1,pos2); // pos1+pos2 와 동일 } | cs |
여기서 연산자 오버로딩은 본래 기능의 큰 틀을 벗어나지 않게 하기 등의 여러 주의점이 있으므로 신중히 사용하여야 한다.
10-2. 단항 연산자의 오버로딩
증감 연산과 같이 단항 연산자도 오버로딩이 필요할 수 있는데 증감 연산은 전위와 후위 두 가지가 있다.
그렇지만 똑같이 ++, -- 연산이기에 이를 구분하기 위해 매개변수에 int 형을 추가해서 오버로딩하여 컴파일러가 구분할 수 있도록 한다.
그리고, 전위 연산은 계속 진행할 수 있도록 참조형을 반환해주도록 하고, 후위 연산은 한번만 진행할 수 있도록 const 선언 후 객체를 반환한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class Point{ ... // 후위 증가 const Point operator++(int){ const Point obj(xpos,ypos); xpos+=1; ypos+=1; return obj; } // 전위 증가 Point & operator++(){ xpos+=1; ypos+=1; return *this; // 다시금 ++(++pos)와 같은 형태 허용하기 위해 포인터 반환 } friend Point & operator--(Point &); friend const Point operator--(Point & ,int); }; // 전위 감소 friend Point & operator--(Point & pos){ pos.xpos-=1; pos.ypos-=1; return pos; } // 후위 감소 friend const Point operator--(Point & pos,int){ const Point obj(pos.xpos,pos.ypos); xpos-=1; ypos-=1; return obj; } | cs |
10-3. 교환법칙 문제의 해결
자료형이 다른 두 형태의 연산자 오버로딩도 마찬가지로 구현하면된다.
단, 3 + pos1 과 같이 기본자료형이 앞에 오는 경우처럼 교환법칙을 고려하여
전역함수에 위의 연산자 오버로딩을 구현해주어야 한다.
10-4. cout, cin 그리고 endl의 정체
cout과 cin에서 사용하는 <<, >> 연산자들도 마찬가지로 연산자 오버로딩이다.
연산자 오버로딩을 통하여 printf와 scanf 를 허용하고 있는 것이며 cout<<1<<3<<endl; 과 같이 계속 연산을 이어갈 수 있도록 return 객체 참조값을 반환해주어야 한다.
'Archived(CSE Programming) > cpp' 카테고리의 다른 글
Chap 12. String 클래스의 디자인 (0) | 2019.01.13 |
---|---|
Chap 11. 연산자 오버로딩 2 (0) | 2019.01.13 |
Chap 9. 가상(Virtual)의 원리와 다중상속 (0) | 2019.01.10 |
Chap 8. 상속과 다형성 (0) | 2019.01.09 |
Chap 7. 상속(Inheritance)의 이해 (0) | 2019.01.08 |