정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template

Slides:



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

Vision System Lab, Sang-Hun Han
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
명품 C++ 프로그래밍 3장. 클래스와 객체.
명품 C++ 8장 상속.
명품 C++ 4장. 객체 포인터와 객체 배열, 객체의 동적 생성.
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C++ Espresso 제1장 기초 사항.
C++ Espresso 제2장 제어문과 함수.
강좌명 : C++프로그래밍 (C++ Programming)
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
5장. 리스트 리스트 학습목표 목록이나 도표처럼 여러 데이터를 관리할 수 있는 자료형을 추상화
8. 객체와 클래스 (기본).
윤 홍 란 다형성과 가상 함수 윤 홍 란
Internet Computing KUT Youn-Hee Han
제12장 다형성과 가상함수 다형성의 개념을 이해한다. 상향 형변환의 개념을 이해한다. 가상 함수의 개념을 이해한다.
C++ Espresso 제9장 다형성.
10장 템플릿과 표준 템플릿 라이브러리(STL)
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
명품 C++ 8장 상속.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
상속이란? - 기반클래스로부터 다른 클래스를 파생하는 법 protected란? 가상함수 (virtual function)
제 3장. C보다 나은 C++ II.
다중 상속 - 가상 상속 추상 자료형 순수 가상함수
명품 C++ 7장 프렌드와 연산자 중복.
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
Chapter 05. 클래스 완성. chapter 05. 클래스 완성 01. 복사 생성자 복사 생성(Copy Construction) 생성될 때 자신과 같은 타입의 객체를 변수로 받아, 이 객체와 같은 값을 갖는 새로운 객체를 생성하는 것 명시적인 생성 과정뿐만.
C ++ 프로그래밍 시작.
C++ Espresso 제12장 템플릿.
배열이란? 배열의 선언? - 배열과 포인터의 관계? 문자열이란? 문자배열 연결 리스트
스택(Stack) 김진수
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
13. 연산자 오버로딩.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
명품 C++ 9장 가상 함수와 추상 클래스.
가상함수와 추상 클래스.
Chapter 1 C와는 다른 C++. 최호성.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
루프와 카운트 Looping and counting
멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행 Point p3 = p1+p2; 에서
멤버함수 중첩( 복사 생성자 ) - 연사자 중첩 - 동적 메모리를 가지는 클래스를 지원 하도록 멤버 함수 작성
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
JA A V W. 06.
A Basic of C++.
5. 논리적 자료표현 : 구조체.
12. 상속 : 고급.
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
Chapter 13. 템플릿(Template) 1
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
Chapter 2 C++ 함수와 네임스페이스. 최호성.
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
10장 템플릿과 표준 템플릿 라이브러리(STL)
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
C++ 언어의 특징
Presentation transcript:

정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template 기타 정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template

정적 멤버 변수 class Name{ public: static int counter; … }; 클래스의 모든 인스턴스(객체) 사이에서 공유되는 변수 객체에 속하는 것이 아니라 클래스에 속하는 것으로 이해 전역 변수와 멤버 변수의 절충형 주로 객체의 수를 파악하기 위해 사용 class Name{ public: static int counter; … }; int Name::counter = 0; int main( ) { }

#include <iostream> using namespace std; class Cat { public: Cat(int age):itsAge(age){HowManyCats++; } virtual ~Cat() { HowManyCats--; } virtual int GetAge() { return itsAge; } virtual void SetAge(int age) { itsAge = age; } static int HowManyCats; private: int itsAge; }; list 15.1

int Cat::HowManyCats = 0; int main() { const int MaxCats = 5; int i; Cat *CatHouse[MaxCats]; for (i = 0; i<MaxCats; i++) CatHouse[i] = new Cat(i); cout << "There are "; cout << Cat::HowManyCats; cout << " cats left!\n"; cout << "Deleting the one which is "; cout << CatHouse[i]->GetAge(); cout << " years old\n"; delete CatHouse[i]; CatHouse[i] = 0; } return 0;

정적 멤버 함수 정적 멤버 변수의 접근 정적 멤버 함수 public 일 때 : list 15.1에서와 같이 직접 접근 private 일 때 public 멤버 함수를 이용하여 정적 멤버 변수에 접근 객체가 반드시 존재해야만 접근 가능 정적 멤버 함수 객체내에서 존재하는 것이 아니라 클래스에 존재 정적 멤버 함수는 this라는 포인터를 갖지 않는다 정적 멤버 함수는 정적 멤버 변수에 접근 가능 정적 멤버 함수는 일반 멤버 변수에 접근 불능 const로 선언 될 수 없다

#include <iostream> using std::cout; class Cat { public: Cat(int age):itsAge(age){HowManyCats++; } virtual ~Cat() { HowManyCats--; } virtual int GetAge() { return itsAge; } virtual void SetAge(int age) { itsAge = age; } virtual int GetHowMany() { return HowManyCats; } private: int itsAge; static int HowManyCats; }; list 15.3

int Cat::HowManyCats = 0; int main() { const int MaxCats = 5; int i; Cat *CatHouse[MaxCats]; for (i = 0; i<MaxCats; i++) CatHouse[i] = new Cat(i); cout << "There are "; cout << CatHouse[i]->GetHowMany(); cout << " cats left!\n"; cout << "Deleting the one which is "; cout << CatHouse[i]->GetAge()+2; cout << " years old\n"; delete CatHouse[i]; CatHouse[i] = 0; } return 0;

#include <iostream> class Cat { public: Cat(int age):itsAge(age){HowManyCats++; } virtual ~Cat() { HowManyCats--; } virtual int GetAge() { return itsAge; } virtual void SetAge(int age) { itsAge = age; } static int GetHowMany() { return HowManyCats; } private: int itsAge; static int HowManyCats; }; list 15.4

int Cat::HowManyCats = 0; int main() { const int MaxCats = 5; Cat *CatHouse[MaxCats]; int i; for (i = 0; i<MaxCats; i++) CatHouse[i] = new Cat(i); std::cout<<"There are "<< Cat::GetHowMany() <<" cats alive!\n"; } for ( i = 0; i<MaxCats; i++) delete CatHouse[i]; return 0;

프렌드 함수 객체에 대한 접근 통제 프렌드라는 또 다른 형식의 접근을 제공 class ABC{ 공용 멤버 함수(변수)가 유일한 접근 방법 프렌드라는 또 다른 형식의 접근을 제공 프렌드 함수 프렌드 클래스 프렌드 함수는 멤버 함수가 가진 것과 같은 접근 권한을 가짐 연산자 중복에 주로 이용 =, (), [], -> 연산자는 중복 할 수 없음 프렌드 함수는 this 포인터를 가지지 않음 class ABC{ friend void func( void ); }; class ABC{ friend class DEF; };

#include <iostream> using namespace std; class Complex; Complex Add( Complex c1, Complex c2 ); Complex Sub( Complex c1, Complex c2 ); class Complex{ public: Complex(): real(0), imag(0) { } Complex( double a, double b ): real(a), imag(b) { } friend Complex Add( Complex c1, Complex c2 ); friend Complex Sub( Complex c1, Complex c2 ); void Show(void); private: double real, imag; }; list friend.1

Complex Add( Complex c1, Complex c2 ) { Complex temp; temp.real = c1.real + c2.real; temp.imag = c1.imag + c2.imag; return temp; } Complex Sub( Complex c1, Complex c2 ) temp.real = c1.real - c2.real; temp.imag = c1.imag - c2.imag; void Complex::Show() cout << real; if(imag>=0) cout << "+i" << imag << "\n"; else cout << "-i" << -imag << "\n";

int main() { Complex a(8.7, 2.4), b(2.6, 3.2), sum, sub; sum = Add(a,b); sub = Sub(a,b); cout << "Result of Summation: "; sum.Show(); cout << "Result of Subtraction: "; sub.Show(); return 0; }

#include <iostream> using namespace std; class Complex{ public: Complex(): real(0), imag(0) { } Complex( double a, double b ): real(a), imag(b) { } Complex operator+( Complex c2 ); Complex operator-( Complex c2 ); void Show(void); private: double real, imag; }; list friend.2

Complex Complex::operator+( Complex c2 ) { Complex temp; temp.real = real + c2.real; temp.imag = imag + c2.imag; return temp; } Complex Complex::operator-( Complex c2 ) temp.real = real - c2.real; temp.imag = imag - c2.imag; void Complex::Show() cout << real; if(imag>=0) cout << "+i" << imag << "\n"; else cout << "-i" << -imag << "\n";

int main() { Complex a(8.7, 2.4), b(2.6, 3.2), sum, sub; sum = a + b; sub = a - b; cout << "Result of Summation: "; sum.Show(); cout << "Result of Subtraction: "; sub.Show(); return 0; }

#include <iostream> using namespace std; class Complex; Complex operator+( Complex c1, Complex c2 ); Complex operator-( Complex c1, Complex c2 ); class Complex{ public: Complex(): real(0), imag(0) { } Complex( double a, double b ): real(a), imag(b) { } friend Complex operator+( Complex c1, Complex c2 ); friend Complex operator-( Complex c1, Complex c2 ); void operator() (); private: double real, imag; }; list friend.3

Complex operator+( Complex c1, Complex c2 ) { Complex temp; temp.real = c1.real + c2.real; temp.imag = c1.imag + c2.imag; return temp; } Complex operator-( Complex c1, Complex c2 ) temp.real = c1.real - c2.real; temp.imag = c1.imag - c2.imag; void Complex::operator() () cout << real; if(imag>=0) cout << "+i" << imag << "\n"; else cout << "-i" << -imag << "\n";

int main() { Complex a(8.7, 2.4), b(2.6, 3.2), sum, sub; sum = a + b; sub = a - b; cout << "Result of Summation: "; sum(); cout << "Result of Subtraction: "; sub(); return 0; }

#include <iostream> using namespace std; class Complex; Complex operator+( Complex c1, Complex c2 ); Complex operator-( Complex c1, Complex c2 ); class Complex{ public: Complex(): real(0), imag(0) { } Complex( double a, double b ): real(a), imag(b) { } friend Complex operator+( Complex c1, Complex c2 ); friend Complex operator-( Complex c1, Complex c2 ); void operator() (); private: double real, imag; }; list friend.3

Complex operator+( Complex c1, Complex c2 ) { Complex temp; temp.real = c1.real + c2.real; temp.imag = c1.imag + c2.imag; return temp; } Complex operator-( Complex c1, Complex c2 ) temp.real = c1.real - c2.real; temp.imag = c1.imag - c2.imag; void Complex::operator() () cout << real; if(imag>=0) cout << "+i" << imag << "\n"; else cout << "-i" << -imag << "\n";

int main() { Complex a(8.7, 2.4), b(2.6, 3.2), sum, sub; sum = a + b; sub = a - b; cout << "Result of Summation: "; sum(); cout << "Result of Subtraction: "; sub(); return 0; }

템플릿 (template) 템플릿 함수나 클래스를 생성하는데 사용될 수 있는 함수 또는 클래스의 원형(틀) 컴파일 동안에 실제 함수와 클래스를 생성하기 위해 템플릿 사용 템플릿을 통해 하나 또는 그 이상의 실제적인 함수나 클래스 제작 가능

함수 템플릿 함수 템플릿 int max (int x, int y) { return ( x>y ) ? x : y ; } 일반적인 함수 작성 int max (int x, int y) { return ( x>y ) ? x : y ; } float max (float x, float y) { return ( x>y ) ? x : y ; } long max (long x, long y) { return ( x>y ) ? x : y ; } double max (double x, double y) { return ( x>y ) ? x : y ; } 함수가 생성될 때 교체될 포괄적인 형 template <class TYPE> TYPE max (TYPE x, TYPE y) { return ( x>y ) ? x : y ; }

#include <iostream> using namespace std; template <class TYPE> TYPE max (TYPE x, TYPE y) { return (x>y) ? x : y; } int main() int i1, i2; cout << "\nFirst Number:" ; cin >> i1; cout << "\nSecond Number:" ; cin >> i2; cout << "\nMax Number :" << max(i1, i2) << endl; float f1, f2; cin >> f1; cin >> f2; cout << "\nMax Number :" << max(f1, f2) << endl; return 0; list template.1

#include <iostream> using namespace std; template <class T> T smallest (T arr[], int size) { T smallestValue = arr[0]; for( int index=0 ; index<size ; index++ ) if( arr[index] < smallestValue) smallestValue = arr[index]; } return smallestValue; int main() int arr1[4] = {8, 2, 45, 67}; cout << "Smallest integer value is: "; cout << smallest(arr1, 4) << endl; double arr2[5] = {3.5, 5.6, 1.22, 78.4, 6.0}; cout << "Smallest double value is: "; cout << smallest(arr2, 5) << endl; return 0; list template.2

클래스 템플릿 클래스 템플릿 template <class TYPE> class Array { public: … 다른 형의 속성들을 가지는 여러 개의 클래스를 필요로 하는 경우 발생 예) 일반화된 배열 클래스 template <class TYPE> class Array { public: … protected: TYPE * array; int capacity; int next UnusedIndex; }; int main( ) { Array <int> intarray; }

#include <iostream> using namespace std; template <class TYPE> class Array { protected: TYPE *ary; int capacity; int nextUnusedIndex; public: Array(int size); int getCapacity() const; bool isFull() const; void append (TYPE data); int find (TYPE data) const; TYPE retrieve (int index) const; void change (int index, TYPE data); }; list template.3

template <class TYPE> Array<TYPE>::Array(int size) { capacity = size; nextUnusedIndex = 0; ary = new TYPE[capacity]; } int Array<TYPE>::getCapacity() const return capacity; bool Array<TYPE>::isFull() const return (nextUnusedIndex==capacity);

template <class TYPE> void Array<TYPE>::append(TYPE data) { if(capacity > nextUnusedIndex) { ary[nextUnusedIndex] = data; nextUnusedIndex++; } else{ cout << "Error 100 : Array Overflow"; exit(100); int Array<TYPE>::find(TYPE data) const int index = 0; bool found = false; while(!found && index<nextUnusedIndex){ if( ary[index]==data ) found = true; else index++; if(found) return index; else return -1;

template <class TYPE> TYPE Array<TYPE>::retrieve(int index) const { if( index<0 || index>=nextUnusedIndex ) cout << "Error 101: Index out of range"; exit(101); } return ary[index]; void Array<TYPE>::change( int index, TYPE data) if(index<0 || index>=nextUnusedIndex) cout << "Error 102: index out of range"; exit(102); ary[index] =data

int main() { Array<int> intary(30); Array<float> floatary(20); for( int i=0 ; i<20 ; i++ ) intary.append(i*100); floatary.append(i*3.14); } return 0;