7 장 프렌드와 연산자 중복 1 명품 C++. 친구란 ? 2 우리 집 냉장고 내 침대 우리 집 TV 우리 집 식탁 친구 친구 ? 내 가족의 일원은 아니지만 내 가족과 동일한 권한을 가진 일원으로 인정받은 사람.

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

Ⅰ. 연산자 Ⅱ. 제어 구조. 연산자 : 할당 연산자 - 사용자가 정의한 변수에 임의의 값을 저장하는 기능 strvar = strVar1+ “ Hello ”
변수와 조건문 빛나리 36 호 박승운. 파이썬 쉽게 사용하기 Python IDLE 사용 FILE - New File 로 파일 만들기 Run – Run Module 로 실행하기.
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
최윤정 Java 프로그래밍 클래스 상속 최윤정
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
명품 C++ 6장 함수 중복과 static 멤버.
제12장 다형성과 가상함수 다형성의 개념을 이해한다. 상향 형변환의 개념을 이해한다. 가상 함수의 개념을 이해한다.
명품 C++ 프로그래밍 3장. 클래스와 객체.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
10장 함수.
Lesson 6. 형변환.
제 3장. C보다 나은 C++ II.
명품 C++ 7장 프렌드와 연산자 중복.
제3장 스택과 큐.
명품 C++ 7장 프렌드와 연산자 중복.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
명품 C++ 4장. 객체 포인터와 객체 배열, 객체의 동적 생성.
제4장 클래스와 객체 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여.
Lesson 7. 클래스와 메소드 - 1.
14. 예외처리.
11장. 1차원 배열.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C#.
13. 연산자 오버로딩.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
7장 인터페이스와 추상 클래스.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
Lesson 4. 수식과 연산자.
명품 C++ 9장 가상 함수와 추상 클래스.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
에어 조건문.
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
자바 5.0 프로그래밍.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Chapter 02. 자바 기본 문법.
문자열 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
JA A V W. 06.
12. 상속 : 고급.
객체기반 SW설계 팀활동지 4.
제 6 장 함수(functions).
에어 PHP 입문.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
3. 모듈 (5장. 모듈).
16장. 변수, 연산자, 사용자 정의 함수 변수 배열과 객체 연산자 함수.
Numerical Analysis Programming using NRs
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
상속 (Inheritance) private 전용부분 전용부분 공용부분 공용부분 public 기본 클래스
7 생성자 함수.
6 객체.
Presentation transcript:

7 장 프렌드와 연산자 중복 1 명품 C++

친구란 ? 2 우리 집 냉장고 내 침대 우리 집 TV 우리 집 식탁 친구 친구 ? 내 가족의 일원은 아니지만 내 가족과 동일한 권한을 가진 일원으로 인정받은 사람

C++ 프렌드  프렌드 함수  클래스의 멤버 함수가 아닌 외부 함수 전역 함수 다른 클래스의 멤버 함수  friend 키워드로 클래스 내에 선언된 함수 클래스의 모든 멤버를 접근할 수 있는 권한 부여 프렌드 함수라고 부름  프렌드 선언의 필요성 : cout << …, 2 + person, 클래스의 멤버로 선언하기에는 무리가 있고, 클래스의 모든 멤버를 자유롭 게 접근할 수 있는 일부 외부 함수 작성 시 3

프렌드로 초대하는 3 가지 유형  프렌드 함수가 되는 3 가지 전역 함수 : 클래스 외부에 선언된 전역 함수 다른 클래스의 멤버 함수 : 다른 클래스의 특정 멤버 함수 다른 클래스 전체 : 다른 클래스의 모든 멤버 함수 4 전역 함수

프렌드 선언 3 종류 5 class Rect { friend bool RectManager::equals(Rect r, Rect s); }; 2. RectManager 클래스의 equals() 멤버 함수를 Rect 클래스에 프렌드로 선언 class Rect { // Rect 클래스 선언... friend bool equals(Rect r, Rect s); }; 1. 외부 함수 equals() 를 Rect 클래스에 프렌드로 선언 class Rect { friend RectManager; }; 3. RectManager 클래스의 모든 멤버 함수를 Rect 클래스에 프렌드로 선언

예제 7–1 프렌드 함수 만들기 6 #include using namespace std; class Rect; bool equals(Rect r, Rect s); // equals() 함수 선언 class Rect { // Rect 클래스 선언 int width, height; public: Rect(int width, int height) { this->width = width; this->height = height;} friend bool equals(Rect r, Rect s); }; bool equals(Rect r, Rect s) { // 외부 함수 if(r.width == s.width && r.height == s.height) return true; else return false; } int main() { Rect a(3,4), b(4,5); if(equals(a, b)) cout << "equal" << endl; else cout << "not equal" << endl; } not equal equals() 함수를 프렌드로 선언 equals() 함수는 private 속성을 가진 width, height 에 접근할 수 있다. Rect 클래스가 선언되기 전에 먼저 참조 되는 컴파일 오류 (forward reference) 를 막기 위한 선언문 객체 a 와 b 는 동일한 크기의 사각 형이므로 “not equal” 출력

예제 7–2 다른 클래스의 멤버 함수를 프렌드로 선 언 7 #include using namespace std; class Rect; class RectManager { // RectManager 클래스 선언 public: bool equals(Rect r, Rect s); }; class Rect { // Rect 클래스 선언 int width, height; public: Rect(int width, int height) { this->width = width; this->height = height; } friend bool RectManager::equals(Rect r, Rect s); }; bool RectManager::equals(Rect r, Rect s) { if(r.width == s.width && r.height == s.height) return true; else return false; } int main() { Rect a(3,4), b(3,4); RectManager man; if(man.equals(a, b)) cout << "equal" << endl; else cout << "not equal" << endl; } equal RectManager 클래스의 equals() 멤버를 프렌드로 선언 객체 a 와 b 는 동일한 크기의 사 각형이므로 “equal” 출력 Rect 클래스가 선언되기 전에 먼저 참조 되는 컴파일 오류 (forward reference) 를 막기 위한 선언문 RectManager 클 래스는 Rect 클래 스의 private 자료 에 접근이 가능함

예제 7–3 다른 클래스 전체를 프렌드로 선언 8 #include using namespace std; class Rect; class RectManager { // RectManager 클래스 선언 public: bool equals(Rect r, Rect s); void copy(Rect& dest, Rect& src); }; class Rect { // Rect 클래스 선언 int width, height; public: Rect(int width, int height) { this->width = width; this->height = height; } friend RectManager; }; bool RectManager::equals(Rect r, Rect s) { // r 과 s 가 같으면 true 리턴 if(r.width == s.width && r.height == s.height) return true; else return false; } void RectManager::copy(Rect& dest, Rect& src) { // src 를 dest 에 복사 dest.width = src.width; dest.height = src.height; } int main() { Rect a(3,4), b(5,6); RectManager man; man.copy(b, a); // a 를 b 에 복사한다. if(man.equals(a, b)) cout << "equal" << endl; else cout << "not equal" << endl; } equal 객체 b 의 width, height 값이 a 와 같아진다. man.copy(b,a) 를 통해 객체 b 와 a 의 크기가 동일 하므로 “equal” 출력 Rect 클래스가 선언되기 전에 먼저 참조 되는 컴파일 오류 (forward reference) 를 막기 위한 선언문 RectManager 클래스를 프렌드 함수로 선언

연산자 중복  일상 생활에서의 기호 사용  + 기호의 사례 숫자 더하기 : = 5 색 혼합 : 빨강 + 파랑 = 보라 생활 : 남자 + 여자 = 결혼  + 기호를 숫자와 물체에 적용, 중복 사용  + 기호를 숫자가 아닌 곳에도 사용  간결한 의미 전달  다형성  C++ 언어에서도 연산자 중복 가능  C++ 언어에 본래부터 있든 연산자에 새로운 의미 정의  높은 프로그램 가독성 9

연산자 중복의 사례 : + 연산자에 대해  정수 더하기  문자열 합치기  색 섞기  배열 합치기 10 int a=2, b=3, c; c = a + b; // + 결과는 5. 정수가 피연산자일 때 2 와 3 을 더하기 string a="C", c; c = a + "++“; // + 결과는 “C++". 문자열이 피연산자일 때 두 개의 문자열 합치기 Color a(BLUE), b(RED), c; c = a + b; // c = VIOLET. a, b 의 두 색을 섞은 새로운 Color 객체 c SortedArray a(2,5,9), b(3,7,10), c; c = a + b; // c = {2,3,5,7,9,10}. 정렬된 두 배열을 결합한 (merge) 새로운 배열 생성

연산자 중복의 특징  C++ 에 본래 있는 연산자만 중복 가능  3%5 // 컴파일 오류  6## 7 // 컴파일 오류  피 연산자 타입이 다른 새로운 연산 정의  연산자는 함수 형태로 구현 - 연산자 함수 (operator function)  반드시 클래스와 관계를 가짐  피연산자의 개수를 바꿀 수 없음  연산의 우선 순위 변경 안됨  모든 연산자가 중복 가능하지 않음 11 중복 가능한 연산자 중복 불가능한 연산자

연산자 함수  연산자 함수 구현 방법 2 가지 1. 클래스의 멤버 함수로 구현 2. 외부 함수로 구현하고 클래스에 프렌드 함수로 선언  연산자 함수 형식  사례 12 리턴타입 operator 연산자 ( 매개변수리스트 ); Color a(BLUE), b(RED), c; c = a + b; // a 와 b 를 더하기 위한 + 연산자 작성 필요 if(a == b) { // a 와 b 를 비교하기 위한 == 연산자 작성 필요... }

+ 와 == 연산자의 작성 사례 13 class Color {... Color operator+ (Color op2); bool operator== (Color op2); }; 클래스의 멤버 함수로 작성되는 경우 Color operator + (Color op1, Color op2) {... } bool operator == (Color op1, Color op2) {... } class Color {... friend Color operator+ (Color op1, Color op2); friend bool operator== (Color op1, Color op2); }; 외부 함수로 구현되고 클래스에 프렌드로 선언되는 경우

연산자 중복 설명에 사용할 클래스 14 class Power { // 에너지를 표현하는 파워 클래스 int kick; // 발로 차는 힘 int punch; // 주먹으로 치는 힘 public: Power(int kick=0, int punch=0) { this->kick = kick; this->punch = punch; } };

멤버 함수로 이항 연산자 구현 15

이항 연산자 중복 : + 연산자 16 c = a + b; class Power { int kick; int punch; public: Power operator+ (Power op2); }; c = a. + ( b ); 컴파일러에 의한 변환 리턴 타입 오른쪽 피연산자 b 가 op2 에 전달 Power Power::operator+(Power op2) { Power tmp; tmp.kick = this->kick + op2.kick; tmp.punch = this->punch + op2.punch; return tmp; } Power a + 연산자 함수 코드

예제 7-4 두 개의 Power 객체를 더하는 + 연산자 작성 17 #include using namespace std; class Power { int kick; int punch; public: Power(int kick=0, int punch=0) { this->kick = kick; this->punch = punch; } void show(); Power operator+ (Power op2); // + 연산자 함수 선언 }; void Power::show() { cout << "kick=" << kick << ',' << "punch=" << punch << endl; } Power Power::operator+(Power op2) { Power tmp; // 임시 객체 생성 tmp.kick = this->kick + op2.kick; // kick 더하기 tmp.punch = this->punch + op2.punch; // punch 더하기 return tmp; // 더한 결과 리턴 } int main() { Power a(3,5), b(4,6), c; c = a + b; // 파워 객체 + 연산 a.show(); b.show(); c.show(); } kick=3,punch=5 kick=4,punch=6 kick=7,punch=11 + 연산자 멤버 함수 구현 객체 a, b, c 순 으로 출력 객체 a 의 operator+() 멤버 함수 호출

== 연산자 중복 18 class Power { public: bool operator== (Power op2); }; bool Power::operator==(Power op2) { if(kick==op2.kick && punch==op2.punch) return true; else return false; } a == b a. == ( b ) 컴파일러에 의한 변환 Power a 리턴 타입 오른쪽 피연산자 b 가 op2 에 전달 == 연산자 함수 코드

예제 7-5 두 개의 Power 객체를 비교하는 == 연 산자 작성 19 #include using namespace std; class Power { int kick; int punch; public: Power(int kick=0, int punch=0) { this->kick = kick; this->punch = punch; } void show(); bool operator== (Power op2); // == 연산자 함수 선언 }; void Power::show() { cout << "kick=" << kick << ',' << "punch=" << punch << endl; } bool Power::operator==(Power op2) { if(kick==op2.kick && punch==op2.punch) return true; else return false; } int main() { Power a(3,5), b(3,5); // 2 개의 동일한 파워 객체 생성 a.show(); b.show(); if(a == b) cout << " 두 파워가 같다." << endl; else cout << " 두 파워가 같지 않다." << endl; } kick=3,punch=5 두 파워가 같다. == 연산자 멤버 함수 구현 operator==() 멤버 함수 호출

+= 연산자 중복 20 class Power { public: Power operator+= (Power op2); }; c = a += b; c = a. += ( b ); 컴파일러에 의한 변환 Power Power::operator+=(Power op2) { kick = kick + op2.kick; punch = punch + op2.punch; return *this; } Power a 리턴 타입 오른쪽 피연산자 b 가 op2 에 전달 += 연산자 함수 코드 주목

예제 7-6 두 Power 객체를 더하는 += 연산자 작 성 21 #include using namespace std; class Power { int kick; int punch; public: Power(int kick=0, int punch=0) { this->kick = kick; this->punch = punch; } void show(); Power operator+= (Power op2); // += 연산자 함수 선언 }; void Power::show() { cout << "kick=" << kick << ',' << "punch=" << punch << endl; } Power Power::operator+=(Power op2) { kick = kick + op2.kick; // kick 더하기 punch = punch + op2.punch; // punch 더하기 return *this; // 합한 결과 리턴 } int main() { Power a(3,5), b(4,6), c; a.show(); b.show(); c = a += b; // 파워 객체 더하기 a.show(); c.show(); } kick=3,punch=5 kick=4,punch=6 kick=7,punch=11 a, b 출력 a+=b 후 a, c 출력 += 연산자 멤버 함수 구현 operator+=() 멤버 함수 호출

+ 연산자 작성 ( 실습 ): b = a + 2; 22 #include using namespace std; class Power { int kick; int punch; public: Power(int kick=0, int punch=0) { this->kick = kick; this->punch = punch; } void show(); Power operator+ (int op2); // + 연산자 함수 선언 }; void Power::show() { cout << "kick=" << kick << ',' << "punch=" << punch << endl; } Power Power::operator+(int op2) { Power tmp; // 임시 객체 생성 tmp.kick = kick + op2; // kick 에 op2 더하기 tmp.punch = punch + op2; // punch 에 op2 더하기 return tmp; // 임시 객체 리턴 } int main() { Power a(3,5), b; a.show(); b.show(); b = a + 2; // 파워 객체와 정수 더하기 a.show(); b.show(); } kick=3,punch=5 kick=0,punch=0 kick=3,punch=5 kick=5,punch=7 a, b 출력 b = a + 2 후 a, b 출력 + 연산자 멤버 함수 구현 operator+(int) 함수 호출

멤버 함수로 단항 연산자 구현 23

단항 연산자 중복  단항 연산자  피연산자가 하나 뿐인 연산자 연산자 중복 방식은 이항 연산자의 경우와 거의 유사함  단항 연산자 종류 전위 연산자 (prefix operator) !op, ~op, ++op, --op 후위 연산자 (postfix operator) op++, op-- 24

전위 ++ 연산자 중복 25 class Power { public: Power operator++ ( ); }; ++a a. ++ ( ) 컴파일러에 의한 변환 Power Power::operator++( ) { // kick 과 punch 는 a 의 멤버 kick++; punch++; return *this; // 변경된 객체 자신 ( 객체 a) 리턴 } Power a 리턴 타입 매개 변수 없음 전위 ++ 연산자 함수 코드 x = ++a;

예제 7-8 전위 ++ 연산자 작성 26 #include using namespace std; class Power { int kick; int punch; public: Power(int kick=0, int punch=0) { this->kick = kick; this->punch = punch; } void show(); Power operator++ (); // 전위 ++ 연산자 함수 선언 }; void Power::show() { cout << "kick=" << kick << ',' << "punch=" << punch << endl; } Power Power::operator++() { kick++; punch++; return *this; // 변경된 객체 자신 ( 객체 a) 리턴 } int main() { Power a(3,5), b; a.show(); b.show(); b = ++a; // 전위 ++ 연산자 사용 a.show(); b.show(); } kick=3,punch=5 kick=0,punch=0 kick=4,punch=6 a, b 출력 b = ++a 후 a, b 출력 전위 ++ 연산자 멤버 함수 구현 operator++() 함수 호출

예제 7-9( 실습 ) Power 클래스에 ! 연산자 작성 27 ! 연산자를 Power 클래스의 멤버 함수로 작성하라. !a 는 a 의 kick, punch 파워가 모두 0 이면 true, 아니면 false 를 리턴한다. #include using namespace std; class Power { int kick; int punch; public: Power(int kick=0, int punch=0) { this->kick = kick; this->punch = punch; } void show(); bool operator! (); // ! 연산자 함수 선언 }; void Power::show() { cout << "kick=" << kick << ',' << "punch=" << punch << endl; } bool Power::operator!() { if(kick == 0 && punch == 0) return true; else return false; } int main() { Power a(0,0), b(5,5); if(!a) cout << "a 의 파워가 0 이다.“ << endl; // ! 연산자 호출 else cout << "a 의 파워가 0 이 아니다." << endl; if(!b) cout << "b 의 파워가 0 이다." << endl; // ! 연산자 호출 else cout << "b 의 파워가 0 이 아니다." << endl; } a 의 파워가 0 이다. b 의 파워가 0 이 아니다. ! 연산자 멤버 함수 구현 operator!() 함수 호출

후위 연산자 중복, ++ 연산자 28 Power Power::operator++(int x) { Power tmp = *this; // 증가 이전 객체 상태 저장 kick++; punch++; return tmp; // 증가 이전의 객체 ( 객체 a) 리턴 } class Power { public: Power operator ++ (int x ); }; a++ a. ++ ( 임의의 정수 ) 컴파일러에 의한 변환 객체 a 리턴 타입 매개 변수 후위 ++ 연산자 함수 코드

예제 7-10 후위 ++ 연산자 작성 29 ##include using namespace std; class Power { int kick; int punch; public: Power(int kick=0, int punch=0) { this->kick = kick; this->punch = punch; } void show(); Power operator++ (int x); // 후위 ++ 연산자 함수 선언 }; void Power::show() { cout << "kick=" << kick << ',' << "punch=" << punch << endl; } Power Power::operator++(int x) { Power tmp = *this; // 증가 이전 객체 상태를 저장 kick++; punch++; return tmp; // 증가 이전 객체 상태 리턴 } int main() { Power a(3,5), b; a.show(); b.show(); b = a++; // 후위 ++ 연산자 사용 a.show(); // a 의 파워는 1 증가됨 b.show(); // b 는 a 가 증가되기 이전 상태를 가짐 } kick=3,punch=5 kick=0,punch=0 kick=4,punch=6 kick=3,punch=5 a, b 출력 b = a++ 후 a, b 출력 후위 ++ 연산자 멤버 함수 구현 operator++(int) 함수 호출

2 + a 덧셈을 위한 + 연산자 함수 작성 30 c = 2. + ( a ); b = 2 + a; c = + ( 2, a );  변환 불가능  변환 가능 외부 연산자 함수명 왼쪽 피연산자 오른쪽 피연산자 Power a(3,4), b; b = 2 + a; Power operator+ (int op1, Power op2) { Power tmp; tmp.kick = op1 + op2.kick; tmp.punch = op1 + op2.punch; return tmp; } b = 2 + a;b = + ( 2, a ); 리턴 타입 매개변수 컴파일러에 의한 변환 객체가 아님 ! 멤버함수로 불 가

예제 a 를 위한 + 연산자 함수를 프렌드로 작성 31 #include using namespace std; class Power { int kick; int punch; public: Power(int kick=0, int punch=0) { this->kick = kick; this->punch = punch; } void show(); friend Power operator+(int op1, Power op2); // 프렌드 선언 }; void Power::show() { cout << "kick=" << kick << ',' << "punch=" << punch << endl; } Power operator+(int op1, Power op2) { Power tmp; // 임시 객체 생성 tmp.kick = op1 + op2.kick; // kick 더하기 tmp.punch = op1 + op2.punch; // punch 더하기 return tmp; // 임시 객체 리턴 } kick=3,punch=5 kick=0,punch=0 kick=3,punch=5 kick=5,punch=7 int main() { Power a(3,5), b; a.show(); b.show(); b = 2 + a; // 파워 객체 더하기 연산 a.show(); b.show(); } + 연산자 함수를 외부 함수로 구현 private 속성인 kick, punch 를 접근하도록 하기 위해, 연산자 함수를 friend 로 선언해야 함 a, b 출력 b = 2+a 후 a, b 출력 operator+(2, a) 함수 호출

+ 연산자를 외부 함수로 구현 32 Power operator+ (Power op1, Power op2) { Power tmp; tmp.kick = op1.kick + op2.kick; tmp.punch = op1.punch + op2.punch; return tmp; } c = a + b; c = + ( a, b ); 리턴 타입 매개변수 컴파일러에 의한 변환

예제 7-12 a+b 를 위한 연산자 함수를 프렌드로 작 성 33 #include using namespace std; class Power { int kick; int punch; public: Power(int kick=0, int punch=0) { this->kick = kick; this->punch = punch; } void show(); friend Power operator+(Power op1, Power op2); // 프렌드 선언 }; void Power::show() { cout << "kick=" << kick << ',' << "punch=" << punch << endl; } Power operator+(Power op1, Power op2) { Power tmp; // 임시 객체 생성 tmp.kick = op1.kick + op2.kick; // kick 더하기 tmp.punch = op1.punch + op2.punch; // punch 더하기 return tmp; // 임시 객체 리턴 } int main() { Power a(3,5), b(4,6), c; c = a + b; // 파워 객체 + 연산 a.show(); b.show(); c.show(); } kick=3,punch=5 kick=4,punch=6 kick=7,punch=11 + 연산자 함수 구현 객체 a, b, c 순 으로 출력 operator+(a,b) 함수 호출

단항 연산자 ++ 를 프렌드로 작성하기 34 ++a++ ( a ) a++++ ( a, 0 ) Power operator++ (Power& op) { op.kick++; op.punch++; return op; } Power operator++ (Power& op, int x) { Power tmp = op; op.kick++; op.punch++; return tmp; } 컴파일러에 의한 변환 0 은 의미 없는 값으로 전위 연산자와 구분 하기 위함 (a) 전위 연산자 (b) 후위 연산자 리턴 타입

35 예제 연산자를 프렌드로 작성한 예 #include using namespace std; class Power { int kick; int punch; public: Power(int kick=0, int punch=0) { this->kick = kick; this->punch = punch; } void show(); friend Power operator++(Power& op); // 전위 ++ 연산자 함수 프렌드 선언 friend Power operator++(Power& op, int x); // 후위 ++ 연산자 함수 프렌드 선언 }; void Power::show() { cout << "kick=" << kick << ',' << "punch=" << punch << endl; } Power operator++(Power& op) { // 전위 ++ 연산자 함수 구현 op.kick++; op.punch++; return op; // 연산 결과 리턴 } Power operator++(Power& op, int x) { // 후위 ++ 연산자 함수 구현 Power tmp = op; // 변경하기 전의 op 상태 저장 op.kick++; op.punch++; return tmp; // 변경 이전의 op 리턴 } int main() { Power a(3,5), b; b = ++a; // 전위 ++ 연산자 a.show(); b.show(); b = a++; // 후위 ++ 연산자 a.show(); b.show(); } kick=4,punch=6 kick=5,punch=7 kick=4,punch=6 b = ++a 실행 후 a, b 출력 b = a++ 실행 후 a, b 출력 참조 매개 변수 사 용에 주목

실습문제 (7 장 ) p.356  Book 클래스가 다음과 같이 정의된다. class Book { string title; int price; int pages; public: Book(string title="", int price=0, int pages=0) { this->title = title; this->price = price; this->pages = pages; } void show() { cout << title << ' ' << price << " 원 " <<pages << " 페이지 " << endl; } string getTitle() { return title; } };

 Book 객체에 대해 다음 연산을 수행하고자 한 다. int main() { Book a(" 청춘 ", 20000, 300); Book b(" 미래 ", 30000, 500); a += 500; // 책 a 의 가격 500 원 증가 b -= 500; // 책 b 의 가격 500 원 감소 a.show(); b.show(); }

 +=, -= 연산자 함수를 Book 클래스의 멤버함 수로 구현하시오.  +=, -= 연산자 함수를 Book 클래스의 외부함 수로 구현하시오.

2. Book 객체를 활용하는 사례이다. int main() { Book a(" 명품 C++", 30000, 500), b(" 고품 C++", 30000, 500); if(a == 30000) cout << " 정가 원 " << endl; // price 비교 if(a == " 명품 C++") cout << " 명품 C++ 입니다." << endl; // 책 title 비교 if(a == b) cout << " 두 책이 같은 책입니다." << endl; // title, price, pages 모두 비교 }

 세 개의 == 연산자 함수를 가진 Book 클래스 를 작성하시오. ( 멤버함수 이용 )  세 개의 == 연산자 함수를 프렌드 함수로 작성 하시오.

3. 다음 연산을 통해 공짜 책인지 판별하는 ! 연산 자 함수를 작성하시오. int main() { Book book(" 벼룩시장 ", 0, 50); // 가격은 0 if(!book) cout << " 공짜다 " << endl; }

4. 다음 연산을 통해 책의 제목을 사전순으로 비 교하고자 한다. < 연산자 함수를 작성하라. int main() { Book a(" 청춘 ", 20000, 300); string b; cout >"; getline(cin, b); if(b < a) cout << a.getTitle() << " 이 " << b << " 보다 뒤에 있구 나 !" << endl; }

7. Circle 클래스의 전증가 ++, 후증가 ++ class Circle { int radius; public: Circle(int radius = 0) { this->radius = radius; } void show() { cout << "radius = " << radius << " 인 원 " << endl; } };

 다음 연산이 가능하게 연산자 ++ 를 프렌드로 작성하시오. int main() { Circle a(5), b(4); ++a; // 반지름을 1 증가 시킨다. b = a++; // 반지름을 1 증가 시킨다. a.show(); b.show(); }

8. Circle 클래스에 정수 + 객체 int main() { Circle a(5), b(4); b = 1 + a; // b 의 반지름을 a 의 반지름에 1 을 더한 것으로 변경 a.show(); b.show(); }