멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행 Point p3 = p1+p2; 에서

Slides:



Advertisements
Similar presentations
윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 01. C 언어 기반의 C++ 1.
Advertisements

Kim Yeon Hee 8장. 상속과 다형성 Kim Yeon Hee.
명품 C++ 8장 상속.
명품 C++ 4장. 객체 포인터와 객체 배열, 객체의 동적 생성.
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제1장 기초 사항.
C++ Espresso 제2장 제어문과 함수.
강좌명 : C++프로그래밍 (C++ Programming)
Chapter 6 구조체.
실전 프로젝트 2 : 숫자야구 숫자 야구를 구현해보자.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
8. 객체와 클래스 (기본).
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C++ Espresso 제9장 다형성.
C언어: 배열 (Arrays).
6장. printf와 scanf 함수에 대한 고찰
10장 템플릿과 표준 템플릿 라이브러리(STL)
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
명품 C++ 8장 상속.
C++ Espresso 제6장 생성자와 소멸자.
7장 클래스.
명품 C++ 7장 프렌드와 연산자 중복.
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Chapter 05. 클래스 완성. chapter 05. 클래스 완성 01. 복사 생성자 복사 생성(Copy Construction) 생성될 때 자신과 같은 타입의 객체를 변수로 받아, 이 객체와 같은 값을 갖는 새로운 객체를 생성하는 것 명시적인 생성 과정뿐만.
C++ Programming: Sample Programs
C ++ 프로그래밍 시작.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Programming: chapter 7 – inheritence
C++ 개요 객체지향 윈도우즈 프로그래밍 한국성서대학교 유일선
배열이란? 배열의 선언? - 배열과 포인터의 관계? 문자열이란? 문자배열 연결 리스트
스택(Stack) 김진수
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
13. 연산자 오버로딩.
Chapter 3 클래스. 최호성.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
13. 포인터와 배열! 함께 이해하기.
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
가상함수와 추상 클래스.
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
Chapter 1 C와는 다른 C++. 최호성.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
3장. 클래스의 기본.
루프와 카운트 Looping and counting
문자열 처리하기 working with Strings
멤버함수 중첩( 복사 생성자 ) - 연사자 중첩 - 동적 메모리를 가지는 클래스를 지원 하도록 멤버 함수 작성
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
5. 논리적 자료표현 : 구조체.
18장. 다차원 배열 그리고 포인터.
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
3장,4장 발표 서정우.
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
C++ Espresso 제13장 입출력과 파일처리.
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
Ch16_표준 템플릿 라이브러리.
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
10장 템플릿과 표준 템플릿 라이브러리(STL)
Chapter 14. 템플릿(Template) 2
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
17장. 포인터의 포인터.
C 프로그래밍은 매우 도전적인 작업이다. 도전의 이면에 철저한 준비와 체계적인 노력
Presentation transcript:

yhkim95@gmail.com Kim Yeon Hee 멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행 Point p3 = p1+p2; 에서 1번의 경우는 p1.operator+( p2 )가 2번의 경우는 operator+( p1, p2 )가 실행 된다. 10장. 연산자 오버로딩 yhkim95@gmail.com Kim Yeon Hee

10-1 연산자 오버로딩의 의미 class Point { private: int x, y; public: 10-1 연산자 오버로딩의 의미 class Point { private: int x, y; public: Point(int _x=0, int _y=0):x(_x), y(_y){} void ShowPosition(); void operator+(int val); }; void Point::ShowPosition() { cout<<x<<" "<<y<<endl; } void Point::operator+(int val) { x+=val; y+=val;

10-2 연산자 오버로딩 두 가지 방법 멤버 함수에 의한 오버로딩 class Point { private: int x, y; 10-2 연산자 오버로딩 두 가지 방법 멤버 함수에 의한 오버로딩 class Point { private: int x, y; public: Point(int _x=0, int _y=0):x(_x), y(_y){} void ShowPosition(); Point operator+(const Point& p); }; void Point::ShowPosition(){ cout<<x<<" "<<y<<endl; } Point Point::operator+(const Point& p){ Point temp(x+p.x, y+p.y); return temp; int main(void) { Point p1(1, 2); Point p2(2, 1); Point p3=p1+p2; p3.ShowPosition(); return 0; } 리턴형 속한class p1 + p2 에서 operator+ 함수가 실행. 멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행

실습-멤버함수에 의한 연산자 오버로딩 OpOverloading1.cpp에서는 Point객체를 이용한 덧셈 연산이 가능하도록 연산자가 오버로딩 되어 있다. 이번에는 뺄셈 연산이 가능하도록 연산자를 멤버함수에 의한 방식으로 오버로딩 하여라. main 함수의 예 -결과 int main(void) { Point p1(4,2); Point p2(2,1); Point p3 = p1-p2; p3.ShowPosition(); return 0; }

실습-멤버함수에 의한 연산자 오버로딩 Source Code #include <iostream> using std::cout; using std::cin; using std::endl; //using namespace std; 가 아닌 하나씩 따로 선언해 준다 //연산자 오버로딩 함수를 사용하면 안먹혀서.. 의문임.. class Point { private: int x, y; public: Point(int _x=0, int _y=0):x(_x), y(_y){} void ShowPosition() cout<<"x의 값 : " << x << "\ty의 값 : " << y <<endl; } friend Point operator-(const Point& p1, Point& p2 ); //전역 변수인 operator- 함수는 외부에 있기 때문에 class내부의 //x, y에 접근 가능 하도록 friend 선언을 해준다. }; Point operator-(const Point& p1, Point& p2 ) { //p1객체와 p2객체를 레퍼런스로 받아 준다. //Point class객체로 리턴해 준다. Point temp( p1.x-p2.x, p1.y-p2.y ); return temp; int main(void) { Point p1( 4, 2 ); Point p2( 2, 1 ); Point p3 = p1 - p2; //객체를 연산 한다. p3.ShowPosition(); return 0; }

실습-멤버함수에 의한 연산자 오버로딩 두 객체를 비교할수 있는 !=연산자를 멤버함수에 의한 방식으로 오버로딩 하여라 두 객체를 비교할수 있는 !=연산자를 멤버함수에 의한 방식으로 오버로딩 하여라 Main함수 -결과 int main(void) { Point p1(2,1); Point p2(2,1); Point p3(3,3); if(p1!=p2) cout <<"다르다!"<<endl; else cout <<"같다!"<<endl; if(p2!=p3) return 0; }

실습-멤버함수에 의한 연산자 오버로딩 두 객체를 비교할수 있는 +=연산자를 멤버함수에 의한 방식으로 오버로딩 하여라 두 객체를 비교할수 있는 +=연산자를 멤버함수에 의한 방식으로 오버로딩 하여라 Main함수 int main(void) { Point p1(2,1); Point p2(2,1); p1+=p2; p1.ShowPosition(); return 0; }

10-2 연산자 오버로딩 두 가지 방법 전역 함수에 의한 오버로딩 class Point { private: int x, y; 10-2 연산자 오버로딩 두 가지 방법 전역 함수에 의한 오버로딩 class Point { private: int x, y; public: Point(int _x=0, int _y=0):x(_x), y(_y){} void ShowPosition(); friend Point operator+(const Point&, const Point&); }; void Point::ShowPosition(){ cout<<x<<" "<<y<<endl; } Point operator+(const Point& p1, const Point& p2) { Point temp(p1.x+p2.x, p1.y+p2.y); return temp;} int main(void) { Point p1(1, 2); Point p2(2, 1); Point p3=p1+p2; p3.ShowPosition(); return 0; }

10-2 연산자 오버로딩 두 가지 방법 연산자 오버로딩의 주의 사항 본 의도를 벗어난 연산자 오버로딩! 10-2 연산자 오버로딩 두 가지 방법 연산자 오버로딩의 주의 사항 본 의도를 벗어난 연산자 오버로딩! 연산자 우선 순위와 결합성은 유지된다. 디폴트 매개변수 설정이 불가능하다. 디폴트 연산자들의 기본 기능 변경 불가 int operator+(int a, int b) // 정의 불가능한 함수 { return a+b+3; }

10-3 단항 연산자의 오버로딩 증가, 감소 연산자 오버로딩 그림 10-7 * 단항 연산 : Unary 연산 10-3 단항 연산자의 오버로딩 * 단항 연산 : Unary 연산 Ex) a++, a--, Not 증가, 감소 연산자 오버로딩 단항이기 때문에 ()가 비었다. 그림 10-7

10-3 단항 연산자의 오버로딩 class Point { private: int x, y; public: 10-3 단항 연산자의 오버로딩 class Point { private: int x, y; public: Point(int _x=0, int _y=0):x(_x), y(_y){} void ShowPosition(); Point& operator++(); friend Point& operator--(Point& p); }; void Point::ShowPosition(){ cout<<x<<" "<<y<<endl; } Point& Point::operator++(){ x++; y++; return *this; Point& operator--(Point& p){ p.x--; p.y--; return p;} int main(void) { Point p(1, 2); ++p; //p의 x, y 값을 1씩 증가 p.ShowPosition(); //2, 3 --p; //p의 x, y 값을 1씩 감소 p.ShowPosition(); //1, 2 ++(++p); //p의 x, y 값을 2씩 증가 p.ShowPosition(); //3, 4 --(--p); return 0; } 멤버 함수로 구현 자기 자신의 값을 리턴 ->멤버 함수 이기 때문 전역 함수로 구현 전역변수 이기 때문에 p객체 리턴 리턴형이 Point&으로 레퍼런스형으로 넘겨 주는 이유는 Point형으로만 넘겨준다면 자기자신의 객체를 복사한 복사본을 리턴하기 때문에 ++(++p)같은 경우에 처음에 연산되는 (++p)에 복사본이 넘어 오기때문에 다음 번 연산시 복사본만 증가하게 된다. ->&붙여준다.

10-3 단항 연산자의 오버로딩 선 연산과 후 연산의 구분 ++p  p.operator++(); 10-3 단항 연산자의 오버로딩 선 연산과 후 연산의 구분 ++p  p.operator++(); p++  p.operator++(int); --p  p.operator--(); p--  p.operator--(int);

10-3 단항 연산자의 오버로딩 int main(void) { Point p1(1, 2); 10-3 단항 연산자의 오버로딩 class Point { private: int x, y; public: Point(int _x=0, int _y=0):x(_x), y(_y){} void ShowPosition(); Point& operator++(); Point operator++(int); }; void Point::ShowPosition(){ cout<<x<<" "<<y<<endl; } Point& Point::operator++(){ x++; y++; return *this; } Point Point::operator++(int){ Point temp(x, y); // Point temp(*this); return temp; } int main(void) { Point p1(1, 2); (p1++).ShowPosition(); p1.ShowPosition(); Point p2(1, 2); (++p2).ShowPosition(); return 0; }

10-4 교환 법칙 해결하기 교환 법칙의 적용 Associative1.cpp Associative2.cpp 그림 10-9

10-4 교환 법칙 해결하기 임시 객체의 생성 임시 객체 생성의 적용 TempObj.cpp Point(3, 4); 10-4 교환 법칙 해결하기 임시 객체의 생성 TempObj.cpp 임시 객체 생성의 적용 Associative2.cpp에 적용 Point(3, 4); Point Point::operator+(int val) { return Point(x+val, y+val); }

10-5 cout, cin 그리고 endl의 비밀 #include<stdio.h> namespace mystd //mystd라는 이름공간 시작 { char* endl="\n"; class ostream // 클래스 ostream 정의 { public: ostream& operator<<(char * str) { printf("%s", str); return *this; } ostream& operator<<(int i) { printf("%d", i); return *this; } ostream& operator<<(double i) { printf("%e", i); return *this; } }; ostream cout; //ostream 객체 생성 } // mystd 이름공간 끝 using mystd::cout; using mystd::endl; int main() { cout<<"Hello World"<<endl<<3.14<<endl; return 0; }

10-5 cout, cin 그리고 endl의 비밀 <<, >> 연산자의 오버로딩 Point 객체를 기반으로 하는 <<, >> 입 출력 연산 OpOverloading6.cpp cout<<p  cout.operator<<(p); // (x) cout<<p  operator<<(cout, p); // (o) ostream& operator<<(ostream& os, const Point& p)

arr[i]  arr.operator[](i); 10-6 인덱스 연산자 기본 자료형 데이터 저장 배열 클래스 IdxOverloading1.cpp 객체 저장할 수 있는 배열 클래스 IdxOverloading2.cpp arr[i]  arr.operator[](i);

10-6 인덱스 연산자 디폴트 대입 연산자 멤버 대 멤버 복사 DefaultSubOp.cpp p1.operator=(p2); 10-6 인덱스 연산자 디폴트 대입 연산자 멤버 대 멤버 복사 DefaultSubOp.cpp p1.operator=(p2); Point& Point::operator=(const Point& p) { x=p.x; y=p.y; return *this; }

10-7 대입 연산자 오버로딩 디폴트 대입 연산자의 문제점 class Person { private: char* name; 10-7 대입 연산자 오버로딩 class Person { private: char* name; public: Person(char* _name); Person(const Person& p); ~Person(); friend ostream& operator<<(ostream& os, const Person& p); }; Person::Person(char* _name){ name= new char[strlen(_name)+1]; strcpy(name, _name);} Person::Person(const Person& p){ name= new char[strlen(p.name)+1]; strcpy(name, p.name);} Person::~Person(){ delete[] name; } 디폴트 대입 연산자의 문제점 int main() { Person p1("LEE JUNE"); Person p2("HONG KEN"); cout<<p1<<endl; cout<<p2<<endl; p1=p2; // 문제의 원인 return 0; }

10-7 대입 연산자 오버로딩 디폴트 대입 연산자의 문제점 그림 10-13 그림 10-14

10-7 대입 연산자 오버로딩 깊은 복사(Deep Copy)를 하는 대입 연산자 10-7 대입 연산자 오버로딩 깊은 복사(Deep Copy)를 하는 대입 연산자 Person& Person::operator=(const Person& p) { delete []name; name= new char[strlen(p.name)+1]; strcpy(name, p.name); return *this; }