Microsoft PowerPoint - C++ 5 .pptx

Similar documents
C++ Programming

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - additional01.ppt [호환 모드]

C프로-3장c03逞풚

설계란 무엇인가?

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint Presentation

슬라이드 1

PowerPoint Presentation

Microsoft PowerPoint - additional08.ppt [호환 모드]

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint Template

Microsoft PowerPoint - Chapter 6.ppt

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - ch07 - 포인터 pm0415

설계란 무엇인가?

금오공대 컴퓨터공학전공 강의자료

OCW_C언어 기초

chap10.PDF

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

C++ Programming

Microsoft PowerPoint - Chapter 10.ppt

Microsoft PowerPoint - Chap12-OOP.ppt

PowerPoint Presentation

11장 포인터

C++ Programming

Microsoft PowerPoint - additional06.ppt [호환 모드]

Microsoft PowerPoint - [2009] 02.pptx

C++ Programming

(Microsoft PowerPoint - 11\300\345.ppt [\310\243\310\257 \270\360\265\345])

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

설계란 무엇인가?

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

설계란 무엇인가?

17장 클래스와 메소드

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

PowerPoint 프레젠테이션

PowerPoint Template

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - additional03.ppt [호환 모드]

Microsoft PowerPoint - additional07.ppt [호환 모드]

설계란 무엇인가?

PowerPoint Presentation

02장.배열과 클래스

슬라이드 1

PowerPoint 프레젠테이션

PowerPoint Presentation

Microsoft PowerPoint - chap05-제어문.pptx

Microsoft PowerPoint - chap06-1Array.ppt

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

080629_CFP °ø°³¿ë.hwp

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

Slide 1

untitled

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, dou

Microsoft PowerPoint - 6주차.pptx

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - 9ÀÏ°_ÂüÁ¶ÀÚ.ppt

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

Microsoft PowerPoint - 05장(함수) [호환 모드]

KNK_C_05_Pointers_Arrays_structures_summary_v02

gnu-lee-oop-kor-lec06-3-chap7

PowerPoint 프레젠테이션

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

JAVA PROGRAMMING 실습 05. 객체의 활용

프입2-강의노트-const-friend-static

Microsoft PowerPoint - chap04-연산자.pptx

06 세상을 변화시키는 연산자

Blog

Microsoft PowerPoint - Chapter 1-rev

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

Microsoft PowerPoint - 제11장 포인터

<432B2BC7C1B7CEB1D7B7A1B9D628BABBB9AE5FC3D6C1BE295B315D2E687770>

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - 제11장 포인터(강의)

1. 상속의기본개념 다음과같은문제를위한클래스설계 자동차 속성 : 색상, 배기량, 현재속도 메서드 : 가속하라, 멈춰라, 시동을켜라 트럭 속성 : 색상, 배기량, 현재속도, 최대중량 메서드 : 가속하라, 멈춰라, 시동을켜라 택시 속성 : 색상, 배기량, 현재속도, 요금,

PowerPoint Template

Data Structure

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

Microsoft PowerPoint - chap12-고급기능.pptx

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Microsoft PowerPoint - Java7.pptx

C 프로그래밊 개요

Transcription:

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...