C++ 언어프로그래밍 한밭대학교전자. 제어공학과이승호교수
연산자중복 (operator overloading) 이란? 2 1. 연산자중복이란? 1) 기존에미리정의되어있는연산자 (+, -, /, * 등 ) 들을프로그래머의의도에맞도록새롭게정의하여사용할수있도록지원하는기능 2) 연산자를특정한기능을수행하도록재정의하여사용하면여러가지이점을가질수있음 3) 하나의기능이프로그래머의의도에따라바뀌어동작하는다형성 (polymorphism) 기능 1 + 2 = 3 기존에정의되어있는 + 연산자
연산자중복 (operator overloading) 이란? 3 STU + DENT = STUDENT 문자열을더하는것으로 + 연산자중복 복소수의합에사용된 + 연산자 허수부간의합 a+bj + c+dj = (a+c)+(b+d)j 실수부간의합 정수및실수에대하여적용되던 + 연산자를복소수의연산에도적용하도록 + 연산자중복
연산자중복시주의사항 4 2. 연산자중복시주의사항 1) 연산자를중복하여사용될때의피연산자의개수는변경할수없음 1 + 2 1 + 2, 3 ( O ) ( X ) + 연산자는반드시 2 개의피연산자만사용가능 2) 연산자를중복하여사용해도원래의연산자의우선순위는변경되지않음 (2) (1) (1) (2) 1 + 2 x 3 = 7 (1 + 2) x 3 = 9 6 3
연산자중복시주의사항 5 3) 연산자중복은연산자함수 (operator function) 를사용하여구현됨 operator 연산자사용 반환형 operator 연산자 ( 매개변수1, 매개변수2,...) {... } 4) 연산자함수는다음의 2 가지방법으로선언됨 연산자함수는클래스의멤버함수로선언됨 연산자함수는클래스의프렌드함수로선언됨
연산자중복시주의사항 6 5) 연산자중복이가능한연산자들 + - * / % ^ & ~! = < > += -= *= /= %= ^= &= = << >> <<= >>= ==!= <= >= && ++ -- [] (), -> new delete 6) 연산자중복이불가능한연산자들? : ::.
단항연산자중복 7 3. 단항연산자중복 예제 1 : () 연산자중복함수 () 가원래기능이나객체 () 기능을새로부여함 객체 (MC) 10 m 초기화 MyClass(10) operator ()() 객체의 private 멤버변수 m 을초기화하는생성자 () 연산자중복 : 객체 () => 객체의 private 멤버변수 m의값을출력함
단항연산자중복 8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include <iostream> using namespace std; class MyClass{ int m; MyClass(int a){ m = a; } void operator ()(void){ cout << "m = " << m << endl; } }; // MyClass class int main(void) { MyClass MC(10); } // main() MC(); return 0; 객체의 private 멤버변수 m 을초기화하는생성자 () 연산자중복 : 객체 () => 객체의 private 멤버변수 m의값을출력함 객체 MC 생성시생성자호출됨 MC.operator ()() 호출됨
단항연산자중복 9 실행결과 1 C:\ C:\W C:\WINDOWS\system32\cmd.exe X m = 10 Press any key to continue... MC() 의값
단항연산자중복 10 예제 2 : ++, -- 연산자중복원래기능에 ++ 객체, -- 객체기능을새로부여함 객체 (MC) 10 m 초기화 MyClass(10) operator ()() operator ++() operator --() 객체의 private 멤버변수 m 을초기화하는생성자 () 연산자중복 : 객체 () => 객체의 private 멤버변수 m의값을출력함 ++ 연산자중복 : ++ 객체 => 객체의 private 멤버변수 m 의값을 1 증가시킴 -- 연산자중복 : -- 객체 => 객체의 private 멤버변수 m 의값을 1 증가시킴
단항연산자중복 11 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 34 35 36 37 #include <iostream> using namespace std; class MyClass{ int m; MyClass(int a){ m = a; } void operator ()(void){ cout << m << endl; } void operator ++(void); void operator --(void); }; // MyClass class void MyClass::operator ++(void) { ++m; // MC.++m } // operator ++() void MyClass::operator --(void) { --m; // MC.--m } // operator --() int main(void) { MyClass MC(10); } // main() ++MC; MC(); --MC; MC(); return 0; 객체의 private 멤버변수 m 을초기화하는생성자 () 연산자중복 : 객체 () => 객체의private 멤버변수m의값을출력함 ++ 연산자중복 => 외부정의 -- 연산자중복 => 외부정의 연산자함수가소속된클래스명을명시함 ++ 연산자중복 : ++ 객체 => 객체의 private 멤버변수 m 의값을 1 증가시킴 연산자함수가소속된클래스명을명시함 -- 연산자중복 : ++ 객체 => 객체의 private 멤버변수 m 의값을 1 감소시킴 객체 MC 생성시생성자호출됨 MC.operator ++() 호출됨 MC.operator ()() 호출됨 MC.operator --() 호출됨 MC.operator ()() 호출됨
단항연산자중복 12 실행결과 2 C:\ C:\W ++MC 의값 11 10 --MC의값 Press any key to continue... C:\WINDOWS\system32\cmd.exe X
단항연산자중복 13 예제 3 : - 연산자중복원래기능에 객체기능을새로부여함 자기자신의객체를가리키는포인터 this(00395ab8) 00395AB8 객체 (MC) 10 m MyClass(10) operator -() 초기화객체의private 멤버변수m을초기화하는생성자 - 연산자중복 : -객체 => 객체의 private 멤버변수 m의값을음수화함
단항연산자중복 14 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 #include <iostream> using namespace std; class MyClass{ int m; MyClass(int a){ m = a; } void operator ()(void){ cout << m << endl; } MyClass operator -(void); }; // MyClass class MyClass MyClass::operator -(void) { m = -m; // MC.-m return *this; } // operator -() int main(void) { MyClass MC(10); } // main() MC = -MC; MC(); return 0; 객체의 private 멤버변수 m 을초기화하는생성자 () 연산자중복 : 객체 () => 객체의 private 멤버변수 m의값을출력함 -- 연산자중복 => 외부정의 연산자함수가소속된클래스명을명시함 - 연산자중복 : - 객체 => 객체의 private 멤버변수 m 의값을음수화함 음수화된 MC 객체자신을반환함 객체 MC 생성시생성자호출됨 MC.operator -() 호출됨 MC.operator ()() 호출됨
단항연산자중복 15 실행결과 3 C:\ C:\W -MC 의값 -10 Press any key to continue... C:\WINDOWS\system32\cmd.exe X
단항연산자중복 16 예제 4 :! 연산자중복원래기능에! 객체기능을새로부여함 객체 (MC) 3 m 초기화 MyClass(3) operator!() 객체의 private 멤버변수 m 을초기화하는생성자! 연산자중복 :! 객체 => 객체의 private 멤버변수 m의 factorial 값을구함
단항연산자중복 17 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 #include <iostream> using namespace std; class MyClass{ int m; MyClass(int a){ m = a; } int operator!(void); }; // MyClass class int MyClass::operator!(void) { int sum = 1; do{ sum *= m; }while(--m); return sum; } //operator!() int main(void) { MyClass MC(3); } // main() cout <<!MC << endl; return 0; 객체의 private 멤버변수 m 을초기화하는생성자 // MC.m! 연산자중복 => 외부정의 연산자함수가소속된클래스명을명시함! 연산자중복 :! 객체 => 객체의 private 멤버변수 m의 factorial 값을구함 객체의 private 멤버변수 m 값을 1 씩감소시키면서 sum 값과곱하여그결과를 sum 에다시대입함 sum = sum * m; m 이 0 이되는순간반복문종료함 객체 MC 생성시생성자호출됨 MC.operator!() 호출됨 => 3 * 2 * 1 = 6
단항연산자중복 18 실행결과 4 C:\ C:\W!MC 의값 3 * 2 * 1 = 6 6 Press any key to continue... C:\WINDOWS\system32\cmd.exe X
단항연산자중복 19 예제 5 : [ ] 연산자중복배열 [ ] 가원래기능이나객체 [ ] 기능을새로부여함 객체 (MC) "hello" M[10] MyClass("hello") operator [ ]() 문자열을저장하기위한 char 형 private 멤버배열 초기화 객체생성시인수로전달된문자열을 strcpy_s() 라이브러리함수를사용하여객체의 private 멤버배열 m 영역에복사하는생성자 [ ] 연산자중복 : 객체 [ ] => 문자배열m의n번째문자를반환
단항연산자중복 20 복사 h a[0] e a[1] l a[2] l a[3] a o a[4] 0 a[5] strcpy_s(m, a); h e l l a o 0 복사 m[0] m[1] m[2] m[3] m[4] m[5]
단항연산자중복 21 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include <iostream> using namespace std; class MyClass{ char m[10]; 복사 MyClass(char *a){ strcpy_s(m, a); } char operator [](int n){ return m[n]; } }; // MyClass Class int main(void) { MyClass MC("hello"); } // main() cout << MC[1] << endl; return 0; 문자열을저장하기위한 char 형 private 멤버배열 객체생성시인수로전달된포인터 a 영역의문자열을 strcpy_s() 라이브러리함수를사용하여객체의 private 멤버배열 m 영역에복사하는생성자 [ ] 연산자중복 : [ ] 객체 => 문자배열 m 의 n 번째문자를반환 객체 MC 생성시생성자호출되면서 private 멤버배열 m 을 "hello" 문자열로초기화함 MC.operator [ ](1) 호출됨 => m[1] 의문자를출력
단항연산자중복 22 실행결과 5 C:\ C:\W m[1] 의문자 e Press any key to continue... C:\WINDOWS\system32\cmd.exe X
단항연산자중복 23 예제 6 : = 연산자중복원래기능에객체 = 문자열 기능을새로부여함 클래스 (MyClass) M[20] operator =() operator ()() 문자열을저장하기위한 char 형 private 멤버배열 = 연산자중복 : 객체 = 문자열 => 인수로전달된문자열을 strcpy_s() 라이브러리함수를사용하여객체의 private 멤버배열 m 영역에복사함 () 연산자중복 : 객체 () => 객체의 private 멤버배열 m 영역에저장된문자열을출력함
이항연산자중복 24 객체 (MC) 문자열 M[20] operator =() hello, students\n = hello, students\n *str operator ()()
이항연산자중복 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <iostream> using namespace std; class MyClass{ char m[20]; void operator =(char *str){ strcpy_s(m, str); } void operator ()(void){ cout << m << endl; } }; // MyClass class int main(void) { MyClass MC; } // main() MC = "hello, students\n"; MC(); return 0; 문자열을저장하기위한 char 형 private 멤버배열 = 연산자중복 : 객체 = 문자열 => 인수로전달된문자열을 strcpy_s() 라이브러리함수를사용하여객체의 private 멤버배열 m 영역에복사함 복사 객체 MC 생성 MC.operator () 호출됨 () 연산자중복 : 객체 () => 객체의 private 멤버배열 m 영역에저장된문자열을출력함 MC.operator =("hello, students\n") 호출됨
이항연산자중복 26 실행결과 6 C:\ C:\W C:\WINDOWS\system32\cmd.exe X hello, students Press any key to continue... MC 객체의 public 멤버배열 m 영역에저장된문자열
이항연산자중복 27 4. 이항연산자중복 예제 7 : + 연산자중복원래기능에객체 + 객체기능을새로부여함 클래스 (complex) a, b 초기화 complex() operator +() operator ()() 객체의 private 멤버변수 a 와 b 를초기화하는생성자 + 연산자중복 : 객체 + 객체 => 객체의 private 멤버변수 a와 b의값들을더함 () 연산자중복 : 객체 () => 객체의 private 멤버변수 a 와 b 의값들을복소수형식으로출력
이항연산자중복 28 객체 (MC3) 60, 80 a, b complex(60, 80) 객체 (MC1) 10, 20 a, b = + complex(10, 20) 객체 (MC2) 50, 60 a, b complex(50, 60) operator +() operator +() operator +() operator ()() operator ()() operator ()()
이항연산자중복 29 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 #include <iostream> using namespace std; class complex{ int a, b; complex(int m, int n){ a = m; b = n; } } // main() complex operator +(complex com){ complex temp(0, 0); MC1.a MC1.b temp.a = a + com.a; temp.b = b + com.b; return temp; } // operator +() MC3 = MC1 + MC2; MC3(); return 0; 객체의 private 멤버변수 a 와 b 를초기화하는생성자 + 연산자중복 : 객체 + 객체 => 객체의 private 멤버변수 a 와 b 의값들을더함 MC2.a MC2.b () 연산자중복 : 객체 () => 객체의 private 멤버변수 a와 b의값들을복소수형식으로출력 void operator ()(void){ cout << a << " + " << b << "j" << endl; } }; // complex class MC1.a + MC2.a int main(void) MC1.b + MC2.b { complex MC1(10, 20), MC2(50, 60), MC3(0, 0); 객체 MC1, MC2, MC3 생성시생성자호출됨 MC1.operator +(MC2) 호출됨 MC3.operator ()() 호출됨
이항연산자중복 30 실행결과 7 C:\ C:\W C:\WINDOWS\system32\cmd.exe X 60 + 80j Press any key to continue... 객체의 public 멤버변수 a 와 b 더한값들을복소수형식으로출력
이항연산자중복 31 예제 8 : + 연산자중복원래기능에객체 + 정수기능을새로부여함 클래스 (MyClass) a, b 초기화 MyClass() operator +( 객체 ) operator +(int) operator ()() 객체의 private 멤버변수 a 와 b 를초기화하는생성자 + 연산자중복 : 객체 + 객체 => 객체의 private멤버변수 a와 b의값들을더함 + 연산자중복 : 객체 + 정수 => 객체의 private 멤버변수값들과정수값을더함 () 연산자중복 : 객체 () => 객체의 private 멤버변수 a 와 b 의값들을출력
이항연산자중복 32 객체 (MC3) 객체 (MC1) 객체 (MC2) 6, 8 1, 2 5, 6 a, b a, b a, b MyClass(6, 8) = MyClass(1, 2) + MyClass(5, 6) operator +(MC2) operator +(MC2) operator +(MC2) operator +(int) operator +(int) operator +(int) operator ()() operator ()() operator ()()
이항연산자중복 33 객체 (MC3) 25, 26 a, b 객체 (MC1) 5, 6 a, b 정수 20 MyClass(25, 26) = MyClass(5, 6) + i operator +(MC2) operator +(MC2) operator +(int) operator +(int) operator ()() operator ()()
이항연산자중복 34 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 34 35 36 37 38 39 40 41 42 43 44 45 #include <iostream> using namespace std; class MyClass{ int a, b; MyClass(int m1, int m2){ a = m1; b = m2; } MyClass operator +(MyClass); MyClass operator +(int i){ MyClass temp(0, 0); temp.a = a + i; temp.b = b + i; return temp; } // operator +(int) void operator ()(void){ cout << "a = " << a << ' ' << "b = " << b << endl; } }; // MyClass class 연산자함수의외부정의 MyClass MyClass::operator +(MyClass com) { MyClass temp(0, 0); 연산자함수가소속된클래스명을명시함 MC1.a temp.a = a + com.a; temp.b = b + com.b; return temp; } // operator +(MyClass, MyClass) int main(void) { MyClass MC1(1, 2), MC2(5, 6), MC3(0, 0); } // main() MC3 = MC1 + MC2; MC3(); MC3 = MC2 + 20; MC3(); return 0; 객체의 private 멤버변수 a 와 b 를초기화하는생성자 MC2.a MC2.b MC1.b MC2.a MC2.b + 연산자중복 : 객체 + 객체 => 객체의 private 멤버변수 a 와 b 의값들을더함 MC1.operator +(MC2) 호출됨 MC3.operator ()() 호출됨 객체 MC1, MC2, MC3 생성시생성자호출됨 MC2.operator +(20) 호출됨 MC3.operator ()() 호출됨 + 연산자중복 : 객체 + 정수 => 객체의 private 멤버변수값들과정수값을더함 () 연산자중복 : 객체 () => 객체의 private 멤버변수 a와 b의값들을출력함 MC1.a + MC2.a MC1.b + MC2.b MC2.a + 20 MC2.b + 20
이항연산자중복 35 실행결과 8 C:\ C:\W C:\WINDOWS\system32\cmd.exe MC1 + MC2 의결과값 X a = 6 b = 8 a = 25 b = 26 Press any key to continue... MC2 + 20 의결과값
이항연산자중복 36 예제 9 : > 연산자중복원래기능에객체 > 객체기능을새로부여함 클래스 (MyClass) m 초기화 MyClass() operator >() 객체의 private 멤버변수 m 을초기화하는생성자 > 연산자중복 : 객체 > 객체 => 객체의private 멤버변수m 값의크기를비교함
이항연산자중복 37 객체 (MC1) 20 m MyClass(20) > 객체 (MC2) 10 m MyClass(10) operator >() operator >()
이항연산자중복 38 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <iostream> using namespace std; class MyClass{ int m; MyClass(int i){ m = i; } bool operator >(MyClass mc){ return m > mc.m; } }; // MyClass class bool 자료형이므로이문장이참이면 true(1), 거짓이면 false(0) 를반환함 int main(void) { MyClass MC1(20), MC2(10); 객체 MC1, MC2 생성시생성자호출됨 } // main() if(mc1 > MC2) MC1.operator <(MC2) 호출됨 cout << "MC1은 MC2보다큼 \n"; else cout << "<MC1은 MC2보다작음 \n"; return 0; 객체의 private 멤버변수 m 을초기화하는생성자 > 연산자중복 : 객체 > 객체 => 객체의 private 멤버변수 m 값의크기를비교함 MC1.m MC2.m
이항연산자중복 39 실행결과 9 C:\ C:\W MC1 은 MC2 보다큼 Press any key to continue... C:\WINDOWS\system32\cmd.exe MC1 > MC2 의문장이참이므로 X
프렌드로연산자중복 40 5. 프렌드로연산자중복 1) 연산자중복을클래스멤버함수가아닌외부함수로정의하기위해서는프렌드함수로구현해야함 2) 프렌드함수로연산자를외부에서중복정의하는경우에는피연산자의개수에주의하여야함 => 클래스멤버로선언하는경우에는연산자를호출하는객체가정해져있어호출되는피연산자를고려하지않아도되었으나, 외부에서정의하는경우에는피연산자모두가중복정의된연산자의매개변수로전달되어야함
프렌드로연산자중복 41 예제 10 : 프렌드함수로 + 연산자중복원래기능에객체 + 객체기능을새로부여함 클래스 (MyClass) a, b MyClass() friend operator +( 객체, 객체 ) operator ()() 초기화 객체의 private 멤버변수 a 와 b 를초기화하는생성자 프렌드함수로 + 연산자중복 : 객체 + 객체 => 객체의 private 멤버변수 a 와 b 의값들을더함 () 연산자중복 : 객체 () => 객체의 private 멤버변수 a 와 b 의값들을출력
프렌드로연산자중복 42 객체 (MC3) 6, 8 a, b MyClass(6, 8) 객체 (MC1) 1, 2 a, b = + MyClass(1, 2) 객체 (MC2) 5, 6 a, b MyClass(5, 6) friend operator +(MC1, MC2) friend operator +(MC1, MC2) friend operator +(MC1, MC2) operator ()() operator ()() operator ()()
프렌드로연산자중복 43 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 34 #include <iostream> using namespace std; class MyClass{ int a, b; MyClass(int m1, int m2){ a = m1; b = m2; } friend MyClass operator +(MyClass com1, MyClass com2); void operator ()(void){ cout << "a = " << a << ' ' << "b = " << b << endl; } }; // MyClass class MyClass operator +(MyClass com1, MyClass com2) { MyClass temp(0, 0); MC1.a temp.a = com1.a + com2.a; MC2.a temp.b = com1.b + com2.b; MC2.b return temp; MC1.b } // operator +(MyClass, MyClass) int main(void) { MyClass MC1(1, 2), MC2(5, 6), MC3(0, 0); } // main() MC3 = MC1 + MC2; MC3(); return 0; 객체의 private 멤버변수 a 와 b 를초기화하는생성자 프렌드함수로 + 연산자중복 : 객체 + 객체 => 객체의 private 멤버변수 a 와 b 의값들을더함 프렌드연산자함수의외부정의 => 피연산자모두가매개변수로전달됨 MC1.a + MC2.a MC1.b + MC2.b operator +(MC1, MC2) 호출됨 MC3.operator ()() 호출됨 () 연산자중복 : 객체 () => 객체의 private 멤버변수 a와 b의값들을출력함 객체 MC1, MC2, MC3 생성시생성자호출됨
프렌드로연산자중복 44 실행결과 10 C:\ C:\W C:\WINDOWS\system32\cmd.exe X a = 6 b = 8 Press any key to continue... MC1 + MC2 의결과값
프렌드로연산자중복 45 예제 11 : 프렌드함수로 + 연산자중복원래기능에객체 + 정수, 정수 + 객체기능을새로부여함 클래스 (MyClass) a, b MyClass() friend operator +( 객체, 객체 ) operator ()() 초기화 객체의 private 멤버변수 a 와 b 를초기화하는생성자 프렌드함수로 + 연산자중복 : 객체 + 객체 => 객체의 private 멤버변수 a 와 b 의값들을더함 () 연산자중복 : 객체 () => 객체의 private 멤버변수 a 와 b 의값들을출력
프렌드로연산자중복 46 객체 (MC3) 객체 (MC1) 정수 21. 22 a, b 1, 2 a, b 20 MyClass(21, 22) = MyClass(1, 2) + i friend operator +(MC1, int) friend operator +(MC1, int) operator ()() operator ()() 객체 (MC3) 25, 26 a, b 정수 20 객체 (MC2) 5, 6 a, b MyClass(25, 26) = = i + MyClass(5, 6) friend operator +(int, MC2) friend operator +(int, MC2) operator ()() operator ()()
프렌드로연산자중복 47 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 #include <iostream> using namespace std; class MyClass{ int a, b; MyClass(int m1, int m2){ a = m1; b = m2; } friend MyClass operator +(MyClass com, int i); friend MyClass operator +(int i, MyClass com); void operator ()(void){ cout << "a = " << a << ' ' << "b = " << b << endl; } }; // MyClass class MyClass operator +(MyClass com, int i) { MyClass temp(0, 0); MC1.a temp.a = com.a + i; temp.b = com.b + i; return temp; } // operator +(MyClass, int) MyClass operator +(int i, MyClass com) { MyClass temp(0, 0); MC2.a temp.a = i + com.a; temp.b = i + com.b; return temp; } // operator +(int, MyClass) int main(void) { MyClass MC1(1, 2), MC2(5, 6), MC3(0, 0); } // main() MC3 = MC1 + 20; MC3(); MC3 = 20 + MC2; MC3(); return 0; 객체의 private 멤버변수 a 와 b 를초기화하는생성자 MC1.b MC2.b MC3.operator ()() 호출됨 프렌드함수로 + 연산자중복 : 객체 + 정수 => 객체의 private 멤버변수값들과정수값을더함 프렌드함수로 + 연산자중복 : 정수 + 객체 => 정수값과객체의 private 멤버변수값들을더함 () 연산자중복 : 객체 () => 객체의 private 멤버변수 a 와 b 의값들을출력함 프렌드연산자함수의외부정의 ( 객체 + 정수 ) => 피연산자모두가매개변수로전달됨 프렌드연산자함수의외부정의 ( 정수 + 객체 ) => 피연산자모두가매개변수로전달됨 MC1.a + 20 MC1.b + 20 20 +MC2.a 20 +MC2.b 객체 MC1, MC2, MC3 생성시생성자호출됨 operator +(MC1, 20) 호출됨 operator +(20, MC2) 호출됨 MC3.operator ()() 호출됨
프렌드로연산자중복 48 실행결과 11 C:\ C:\W C:\WINDOWS\system32\cmd.exe X a = 21 b= 22 a = 25 b= 26 Press any key to continue... MC1 + 20 의결과값 20 + MC2 의결과값
프렌드로연산자중복 49 예제 12 : 프랜드함수로 ++, -- 연산자중복원래기능에 ++ 객체, -- 객체기능을새로부여함 객체 (MC) m 10 초기화 MyClass(10) operator ()() friend operator ++(&com) friend operator --(&com) 객체의 private 멤버변수 m 을초기화하는생성자 () 연산자중복 : 객체 () => 객체의 private 멤버변수 m의값을출력함 프렌드함수로 ++ 연산자중복 : ++ 객체 => 객체의 private 멤버변수 m 의값을 1 증가시킴 프렌드함수로 -- 연산자중복 : -- 객체 => 객체의 private 멤버변수 m 의값을 1 증가시킴
프렌드로연산자중복 50 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 #include <iostream> using namespace std; class MyClass{ int m; }; // MyClass class MyClass(int a){ m = a; } void operator ()(void){ cout << m << endl; } friend void operator ++(MyClass &com){ ++com.m; } friend void operator --(MyClass &com){ --com.m; } int main(void) { MyClass MC(10); } // main() ++MC; MC(); --MC; MC(); return 0; 객체의 private 멤버변수 m 을초기화하는생성자 () 연산자중복 : 객체 () => 객체의 private 멤버변수 m의값을출력함 객체 MC 생성시생성자호출됨 operator ++(MC) 호출됨 MC.operator ()() 호출됨 operator --(MC) 호출됨 MC.operator ()() 호출됨 프렌드함수로 ++ 연산자중복 : ++ 객체 => 객체의 private 멤버변수 m 의값을 1 증가시킴 프렌드함수로 ++ 연산자중복 : ++ 객체 => 객체의 private 멤버변수 m 의값을 1 감소시킴
프렌드로연산자중복 51 실행결과 12 C:\ C:\W ++MC 의값 11 10 --MC의값 Press any key to continue... C:\WINDOWS\system32\cmd.exe X
형변환연산자중복 52 6. 형변환연산자중복 1) 형변환연산자중복은객체의자료형을변환할때사용함 2) 형변환연산자중복은형변환연산자함수 (type conversion operator function) 를사용하여구현됨 operator 연산자사용 operator 변환하고자하는형 (void) { } return 변환을수행한후의반환형의값 ;
형변환연산자중복 53 예제 13 : 객체의 char 형을객체의 int 형으로변환하는형변환연산자중복 5 => 5 객체 (MC) '5' ch MyClass('5') operator int() 초기화 객체의 private 멤버변수 ch 를초기화하는생성자 형변환연산자중복 : char 형을 int 형으로변환 => 53('5') - 48('0') = 5
형변환연산자중복 54 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <iostream> using namespace std; class MyClass{ char ch; }; // MyClass class MyClass(char c){ ch = c; } operator int(void){ return ch - '0'; } int main(void) { MyClass MC('5'); } // main() int a = int(mc); cout << "a = " << a << endl; return 0; 객체의 private 멤버변수 ch 를초기화하는생성자 형변환연산자중복 : char 형을 int 형으로변환 => 53('5') - 48('0') = 5 객체 MC 생성시생성자호출됨 char 형을 int 형으로변환하는형변환연산자함수호출됨
형변환연산자중복 55 실행결과 13 C:\ C:\W char형을 int형으로변환하는형변환연산자함수 => 53('5') - 48('0') = 5 C:\WINDOWS\system32\cmd.exe X a= 5 Press any key to continue...