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

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

슬라이드 1

C++ Programming

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint Template

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

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

설계란 무엇인가?

1. 기본형의형변환복습 C/C++ 형변환의종류 자동형변환 ( 묵시적형변환 ) 강제형변환 ( 명시적형변환 ) 기본형의자동형변환의예 1. 배열 to 포인터변환 배열명은해당배열의첫번째원소의 주소로변환됨 int ary[10]; int *pary = ary; 2. 함수 to 포

C++ Programming

설계란 무엇인가?

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

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

Microsoft PowerPoint - C++ 5 .pptx

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

Microsoft PowerPoint - Chapter 6.ppt

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - Chap12-OOP.ppt

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

C++ Programming

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

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

PowerPoint Template

11장 포인터

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

Slide 1

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

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

설계란 무엇인가?

설계란 무엇인가?

11장 포인터

쉽게 풀어쓴 C 프로그래밍

OCW_C언어 기초

Microsoft PowerPoint - [2009] 02.pptx

PowerPoint Presentation

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

Microsoft PowerPoint - lecture2.ppt

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

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

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

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

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

Slide 1

080629_CFP °ø°³¿ë.hwp

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

C프로-3장c03逞풚

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

Microsoft PowerPoint - 제11장 포인터

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

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

Chapter 6 Objects and Classes

PowerPoint Presentation

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

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

KNK_C_05_Pointers_Arrays_structures_summary_v02

쉽게 풀어쓴 C 프로그래밍

JAVA PROGRAMMING 실습 08.다형성

Microsoft PowerPoint - Chapter 10.ppt

chap10.PDF

Programming hwp

JAVA PROGRAMMING 실습 05. 객체의 활용

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

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

3장. Hello World

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

C++ Programming

8. 클래스 D는클래스 A, 클래스 B, 클래스 C로부터상속받아맊들고싶다. 아래빈칸을채우시오. ( 대소문자주의하시오 ) class D { ; Student s; 11. 다음프로그램의실행결과는? 9. 다음프로그램의실행결과는? class A{ A(){cout << " 생성

Microsoft PowerPoint - 6주차.pptx

초보자를 위한 C++

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

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

PowerPoint 프레젠테이션

Slide 1

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

<4D F736F F F696E74202D2038C0E55FB0ADC0C7B3EBC6AE28B0A1BBF3C7D4BCF6BFCD20B4D9C7FCBCBA29>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

ThisJava ..

프입2-강의노트-C++기초

Microsoft PowerPoint - Chapter 1-rev

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

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

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

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

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

<432B2BC7C1B7CEB1D7B7A1B9D628BABBB9AE5FC3D6C1BE295B315D2E687770>

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

PowerPoint Template

Microsoft PowerPoint - CSharp-10-예외처리

Slide 1

Microsoft PowerPoint - 2강

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

설계란 무엇인가?

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Programming hwp

Microsoft PowerPoint - additional-11_13l.ppt [호환 모드]

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

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

Transcription:

15 장기타주제들 auto_ptr 변환함수 cast 연산자에의한명시적형변환실행시간타입정보알아내기 (RTTI) C++ 프로그래밍입문

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할당메모리를해제하지않고리턴 cout << " 입력값 : " << *p << endl; delete p; for (int i = 0; i < 10; i++) func(); int *p = new int; 변수 p 가사라지는경우동적으로할당받은메모리도헤제할수있는방법은없을까??? 15 장기타주제들 1

1. auto_ptr 자동으로해제가능한포인터클래스만들기 template <typename T> class AutoPtr private : T *ptr; 내부적으로포인터를가지고있음 AutoPtr(T *p) : ptr(p) T &operator*() return (*ptr); ~AutoPtr() delete ptr; ; // 새로할당한메모리를 ptr에대입 // 역참조연산자 // 소멸자를통해 delete 수행 AutoPtr<int> p(new int); *p = 5; cout << *p << endl; // 동적할당및 AutoPtr 객체생성 함수가끝날때 à 지역변수 p 해제 à 소멸자에의해동적할당메모리해제! 15 장기타주제들 2

1. auto_ptr 표준 C++ : auto_ptr 클래스템플릿제공 <memory> 헤더파일포함 배열에대한동적생성및해제자동화불가 #include <iostream> #include <memory> using namespace std; auto_ptr<int> p(new int); *p = 5; cout << *p << endl; 15 장기타주제들 3

2. 변환함수 상속관계에있는객체들사이의대입관련복습 (9.2절) base 클래스객체 = derived 클래스객체 : 대입가능 그외는불가능다음과같은대입이가능하도록만들려면어떻게해야할까? class base... ; class derived : public base... ; class another... ; base b; derived d; another a; int i; b = d; d = b; a = b; b = i; i = b; // 1 O, base 객체 = derived 객체 // 2 X, derived 객체 = base 객체 // 3 X, another 객체 = base 객체 // 4 X, base 객체 = int 변수 // 5 X, int 변수 = base 객체 1. 자동으로가능한경우는? 2. 대입연산자오버로딩으로가능한경우는? 3. 지금까지배운것만으로는불가능한경우는? 15 장기타주제들 4

2. 변환함수 대입연산자오버로딩을사용한대입해결 : 2, 3, 4 class base int x; int 값이 base 객체로형변환된후대입됨 ; base(int a = 0) x = a; // 4의해결, int à base 형변환 void show(void) cout << "base : " << x << endl; class derived : public base int y; ; derived(int a = 0, int b = 0) : base(a) y = b; void show(void) base::show(); cout << "derived : " << y << endl; void operator=(const base &b) // 2의해결, 대입연산자오버로딩 x = b.x; y = b.x; 15 장기타주제들 5

2. 변환함수 대입연산자오버로딩을사용한대입해결 : 2, 3, 4 ( 계속 ) class another double z; ; another(double c = 0) z = c; void show(void) cout << "another : " << z << endl; void operator=(const base &b) // 3의해결, 대입연산자오버로딩 z = b.x; base b; derived d; another a; int i = 1; b = d; // 1 O, base 객체 = derived 객체 d = b; // 2 O, derived 객체 = base 객체 a = b; // 3 O, another 객체 = base 객체 b = i; // 4 O, base 객체 = int 변수 //i = b; // 5 X, int 변수 = base 객체 불가능? 해결방법은? à 변환함수! 15 장기타주제들 6

2. 변환함수 변환함수를이용한 5(int 변수 = base 객체 ) 의해결 변환함수문법 : operator int() ; return int 값 ; class base int x; ; base(int a = 0) x = a; void show(void) cout << "base : " << x << endl; operator int(); // return (x * x); // 5 의해결, 변환함수 base::operator int() // 외부정의 return (x * x); 2, 3 의경우대입연산자오버로딩을사용하지않고변환함수로해결가능 à 연습문제 15.3 15 장기타주제들 7

3. cast 연산자에의한명시적형변환 C 스타일의명시적형변환 ( 타입명 ) 변수명 ; 형변환예 class Base ; class Derived : public Base ; class Another ; int i; int *p; double d; Base *b; Derived *d; Another *a; i = (int) d; // 1 가능, 묵시적형변환가능 p = (int *) &d; // 2 가능 p = (int *) b; // 3 가능현재 b가 derived 객체를가리킨다면? Ok! b = (Base *) d; // 4 가능, 묵시적 base 형변환객체를가리킨다면가능? 논리적오류가능! d = (Derived *) b; // 5 가능 b = (Base *) a; // 6 가능 진짜원한것인가? C++ : C 스타일사용가능 다양한형변환을구별하기위한 4개의명시적형변환연산자제공 dynamic_cast, const_cast, static_cast, reinterpret_cast 15 장기타주제들 8

3. cast 연산자에의한명시적형변환 dynamic_cast 상속관계인클래스객체포인터또는참조에대해적용가능 가상함수를포함하고있어야함 VC++ 6.0의경우컴파일옵션으로 class Base /GR 추가 int b; virtual void func() cout << "Base" << endl; ; ; class Derived : public Base int d; void func() cout << "Derived" << endl; ; Base *b = new Derived(); //Base *b = new Base(); // 바꾸어수행해보라. Derived *d = dynamic_cast<derived *> (b); // b 가가리키는주소대입 if (d == NULL) cout << " 형변환실패 " << endl; else cout << " 형변환성공 " << endl; b 가 Derived 객체를가리키고있다면 à 성공 Base 객체를가리키고있다면 ànull 15 장기타주제들 9

3. cast 연산자에의한명시적형변환 static_cast 상속관계인클래스객체포인터또는참조에대해적용가능 앞의예에서 Base *b = new Base(); 인경우에도형변환성공 const_cast 포인터변수값을 const 형에서일반형으로, 일반형에서 const 형으로변환 const 를제외하면동일한포인터타입인경우형변환가능 const double *pi = new double(3.14); double *pi2 = const_cast<double *> (pi); *pi2 = 3.14159; cout << *pi << endl; cout << *pi2 << endl; 15 장기타주제들 10

3. cast 연산자에의한명시적형변환 reinterpret_cast 서로무관한타입사이의형변환가능 int형과포인터형 무관한클래스포인터사이의형변환 Derived 클래스와는무관한 Another 클래스가있을경우 Base *b = new Base(); Another *a = reinterpret_cast<another *> (b); // 형변환가능 C++ 명시적형변환연산자의역할 안전한형변환제공 가독성증가 : 상황을보다쉽게파악할수있음 15 장기타주제들 11

4. 실행시간타입정보알아내기 (RTTI) 다음과같이실행도중에 base 포인터가가리키고있는객체의타입을알수있을까? void main(base *bp) if (bp가가리키는객체의타입이 base이면 ) bp->func1(); else (bp가가리키는객체의타입이 derived이면 ) derived *dp = (derived *) bp; dp->onlyderivedfunc(); derived 객체인경우 derived 객체에만있는멤버함수호출을원함 15 장기타주제들 12

4. 실행시간타입정보알아내기 (RTTI) dynamic_cast 를이용한간접적해결 class Base int b; virtual void func() cout << "Base" << endl; ; ; class Derived : public Base int d; void func() cout << "Derived" << endl; void func2() cout << "func2" << endl; ; Base *b = new Derived(); Derived *d = dynamic_cast<derived *> (b); // 가능하다면 Derived 로변환 if (d == NULL) // Base 객체임 cout << " 형변환실패 " << endl; else // Derived 객체임 d->func2(); 15 장기타주제들 13

4. 실행시간타입정보알아내기 (RTTI) RTTI(RunTime Type Information) 변수, 포인터, 타입에대한정보를알아낼수있는방법제공 typeid 연산자 à type_info 클래스객체의참조반환 int a, b; cout << typeid(a).name() << endl; // 변수가올수도있다. cout << typeid(int).name() << endl; // 타입이올수도있다. if (typeid(a) == typeid(b))... // 두변수의타입이같은지비교할수있다. if (typeid(a) == typeid(int))... // 변수의타입이 int 인지알아낼수있다. Base *b = new Derived(); Derived *d; <typeinfo> 헤더파일포함 VC++ 6.0 의경우컴파일옵션으로 /GR 추가 if (typeid(*b) == typeid(derived)) // b 객체가 Derived 객체인지검사 d = (Derived *) b; cout << typeid(*d).name() << endl; d->func2(); else cout << "Derived 객체가아닙니다 " << endl; 15 장기타주제들 14