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

Similar documents
설계란 무엇인가?

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

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

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

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 - C++ 5 .pptx

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

쉽게 풀어쓴 C 프로그래밍

C++ Programming

설계란 무엇인가?

Microsoft PowerPoint - Chap12-OOP.ppt

슬라이드 1

C++ Programming

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

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

Microsoft PowerPoint - Chapter 6.ppt

쉽게 풀어쓴 C 프로그래밍

설계란 무엇인가?

C++ Programming

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

쉽게 풀어쓴 C 프로그래밍

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

PowerPoint Presentation

PowerPoint 프레젠테이션

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

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

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

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

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

12 장파일입출력 파일입출력의기초파일열기, 사용하기, 닫기파일입출력모드문자단위파일입출력텍스트파일과이진파일 read, write 함수에의한이진파일입출력임의접근입출력스트림상태입출력연산자오버로딩과파일입출력 C++ 프로그래밍입문

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

Microsoft PowerPoint - Chapter 10.ppt

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

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

PowerPoint Template

PowerPoint Template

슬라이드 1

11장 포인터

C++ Programming

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

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

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

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

Blog

Microsoft PowerPoint - chap06-2pointer.ppt

080629_CFP °ø°³¿ë.hwp

Microsoft PowerPoint - CSharp-10-예외처리

Slide 1

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

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

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

Slide 1

설계란 무엇인가?

Microsoft PowerPoint - ch07 - 포인터 pm0415

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

KNK_C_05_Pointers_Arrays_structures_summary_v02

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

JAVA PROGRAMMING 실습 05. 객체의 활용

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

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

쉽게 풀어쓴 C 프로그래밍

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

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

02장.배열과 클래스

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

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

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

설계란 무엇인가?

설계란 무엇인가?

Microsoft PowerPoint - 6주차.pptx

PowerPoint Template

Microsoft PowerPoint - Chapter 1-rev

Programming hwp

Slide 1

<432B2BC7C1B7CEB1D7B7A1B9D628BABBB9AE5FC3D6C1BE295B315D2E687770>

Design Issues

PowerPoint 프레젠테이션

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

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

C프로-3장c03逞풚

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

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

1. 인라인함수 예 : x, y 값중최소값을반환하는매크로와함수작성 // 매크로로구현한경우 #define MIN(X, Y) ((X) < (Y)? (X) : (Y)) X, Y 각각을괄호 ( ) 안에넣는이유는? // 함수로구현한경우 cout << MIN(4, 5) << en

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

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

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

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

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

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

Microsoft PowerPoint - 제11장 포인터

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

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

OCW_C언어 기초

Chapter 6 Objects and Classes

PowerPoint 프레젠테이션

PowerPoint Presentation

PowerPoint Template

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

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

Transcription:

6 장복사생성자 객체의생성과대입객체의값에의한전달복사생성자디폴트복사생성자복사생성자의재정의객체의값에의한반환임시객체 C++ 프로그래밍입문

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a) : x(a), y(a) void Print() cout << "(" << x << ", " << y << ")" << endl; ; int main(void) CPoint P1(3); CPoint P2 = CPoint(4); CPoint P3 = 5; P1.Print(); P2.Print(); P3.Print(); 일반적방법 객체배열생성시주로사용 CPoint(5) 로형변환후초기화 return 0; 6 장복사생성자 1

1. 객체의생성과대입 복사생성과대입 class CPoint private : int x, y; public : CPoint(int a) : x(a), y(a) void Print() cout << "(" << x << ", " << y << ")" << endl; ; int main(void) CPoint P1(3); // 객체생성, P1 : (3, 3) CPoint P2(4); // 객체생성, P2 : (4, 4) CPoint P3 = P2; // 복사생성, P3 : (4, 4) CPoint P4(P2); // 복사생성, P4 : (4, 4) P1 = P2; // 객체대입, P1 : (4, 4) P1.Print(); P2.Print(); P3.Print(); P4.Print(); 객체생성과객체대입을구별하고객체생성중에서도일반생성과복사생성을구별하라. return 0; 6 장복사생성자 2

1. 객체의생성과대입 객체의복사생성과대입 복사생성 : 생성자 ( 그중에서복사생성자 ) 가동작함 대입 : 대입연산자가동작함복사생성과대입연산의디폴트동작 멤버단위복사! 디폴트동작방식은동일 멤버단위복사만으로충분한가? à 다음페이지예제 6 장복사생성자 3

1. 객체의생성과대입 예 : 문자열을다루기위한 CString 클래스구현 #include <iostream> #include <cstring> using namespace std; // strlen, strcpy 함수 class CString private : int len; char *str; // 문자열의길이 // 문자열포인터 public : CString(char *s = "Unknown") len = strlen(s); str = new char[len + 1]; strcpy(str, s); ~CString() delete [] str; void Print() cout << str << endl; ; str3 = str1 + str2; // 가능하려면? à 연산자오버로딩 (7 장 ) int main(void) CString str1 = "C++ Programming"; CString str2 = str1; // 복사생성 CString str3; 언제, 어디서에러가발생하는것일까? str3 = str1; str1.print(); str2.print(); str3.print(); return 0; // 대입연산 6 장복사생성자 4

1. 객체의생성과대입 CString 클래스의문제점분석 CString str2 = str1; 의수행결과 str3 = str1; 의수행결과 모든객체의 *str 이동일한메모리주소를가리킴 à 함수종료시각객체에대한소멸자가수행된다면! 동일한주소에대한 delete 시도 à 에러발생! à 복사생성과대입연산모두문제! 6 장복사생성자 5 해결방안 : 복사생성자 6.3~6.5 절, 대입 7.10 절

2. 객체의값에의한전달 객체의값에의한전달 : 복사생성발생 class CPoint private : int x, y; public : CPoint(int a = 0, int b = 0) : x(a), y(b) void Print() cout << "(" << x << ", " << y << ")" << endl; ; void ShowPoint(CPoint Po) Po.Print(); int main(void) CPoint P1(1, 2); ShowPoint(P1); // 값에의한객체전달 // 값에의한객체전달 return 0; 6 장복사생성자 6

2. 객체의값에의한전달 예 : CString 클래스객체의값에의한전달 : 문제점은? class CString private : int len; char *str; // 문자열의길이 // 문자열포인터 void ShowString(CString str) // 값에의한전달 str.print(); public : CString(char *s = "Unknown") len = strlen(s); str = new char[len + 1]; strcpy(str, s); ~CString() delete [] str; void Print() cout << str << endl; ; int main(void) CString str1 = "C++ Programming"; ShowString(str1); return 0; 1. str의소멸자수행 2. str1의소멸자수행 à 에러 6 장복사생성자 7

3. 복사생성자 복사생성자 복사생성시호출되는특수한생성자 복사생성자의모양유추 일반생성자 : CPoint P1(3, 4); à CPoint(int a, int b); 복사생성자 : CPoint P2(P1); à CPoint(CPoint Po); // ok??? ü 문제점 : 복사생성을위해 P1 을매개변수로전달시또다사복사생성발생 복사생성이무한히반복수행됨 6 장복사생성자 8

3. 복사생성자 복사생성자의모양 CPoint(CPoint &Po); // 참조에의한전달! CPoint(const CPoint &Po); // 실매개변수에대한변경방지 class CPoint private : int x, y; public : CPoint(const CPoint &Po) x = Po.x; y = Po.y; // 복사생성자 // 일반생성자 CPoint(const CPoint &Po, int a) x = Po.x * a; y = Po.y * a; CPoint(int a = 0, int b = 0) : x(a), y(b) // 일반생성자 void Print() cout << "(" << x << ", " << y << ")" << endl; ; int main(void) CPoint P1(1, 2); CPoint P2(P1); CPoint P3(P1, 3); P1.Print(); P2.Print(); P3.Print(); 복사생성 일반생성 return 0; 6 장복사생성자 9

4. 디폴트복사생성자 자동으로생성되는멤버함수 디폴트생성자 : 4.7 절 디폴트소멸자 : 4.7 절 디폴트복사생성자 : 본절 디폴트대입연산자 : 7.10 절 디폴트복사생성자 멤버단위복사 예 : CPoint 복사생성자를명시적으로만드는경우 디폴트복사생성자사라짐 디폴트생성자역시사라짐 CPoint(const CPoint &Po) x = Po.x; y = Po.y; 6 장복사생성자 10

5. 복사생성자의재정의 다음코드에대한올바른동작? CString str1 = "C++ Programming"; CString str2 = str1; 디폴트복사생성자를사용하는경우소멸자호출시에러발생 원하는동작 à 이에맞게복사생성자재정의! 6 장복사생성자 11

5. 복사생성자의재정의 class CString private : int len; char *str; CString 클래스에대한복사생성자재정의 복사생성자 public : CString(const CString &string) len = string.len; str = new char[len + 1]; strcpy(str, string.str); CString(char *s = "Unknown") len = strlen(s); str = new char[len + 1]; strcpy(str, s); ~CString() delete [] str; void Print() cout << str << endl; ; 일반생성자 // 값에의한전달, 복사생성 void ShowString(CString str) str.print(); int main(void) CString str1 = "C++ Programming"; CString str2 = str1; // 복사생성 str1.print(); ShowString(str2); return 0; // 값에의한전달 6 장복사생성자 12

6. 객체의값에의한반환 복사생성자가호출되는경우 객체의선언및초기화 : CPoint P2(P1); 객체의값에의한전달 : void ShowString(CString str) 객체의값에의한반환 : CString GetPoint() return str; CPoint 객체의값에의한반환예 class CPoint private : int x, y; public : CPoint(int a = 0, int b = 0) : x(a), y(b) void Print() cout << "(" << x << ", " << y << ")" << endl; ; CPoint GetPoint(void) CPoint Po(3, 4); return Po; int main(void) CPoint P1 = GetPoint(); P1.Print(); return 0; // 지역객체 Po 생성 // 지역객체값반환 // GetPoint 함수호출 6 장복사생성자 13

6. 객체의값에의한반환 CPoint 객체의반환예의동작원리 6 장복사생성자 14

6. 객체의값에의한반환 CString 객체의반환예 class CString private : int len; char *str; public : CString(char *s = "Unknown") len = strlen(s); str = new char[len + 1]; strcpy(str, s); ~CString() delete [] str; void Print() cout << str << endl; ; CString GetString(void) CString str("current String"); return str; return 0; // 객체생성 // 객체값반환, 임시객체생성 왜에러가발생하는것일까? à 객체반환에따른복사생성 int main(void) CString str1 = GetString(); str1.print(); 6 장복사생성자 15

6. 객체의값에의한반환 CString 객체반환시에러발생원인 지역객체인 str 과임시객체가동일한메모리를가리킴 str 에대한소멸자호출후임시객체에대한소멸자호출시에러발생! 6 장복사생성자 16

6. 객체의값에의한반환 CString 객체반환예의문제점해결 복사생성자만으로 ok! CString(const CString &string) len = string.len; str = new char[len + 1]; strcpy(str, string.str); 6 장복사생성자 17

7. 임시객체 임시객체 (temporary object) 의사용예 class CPoint private : int x; int y; public : CPoint(const CPoint &Po) : x(po.x), y(po.y) cout << " 복사생성자 : " << x << ", " << y << endl; CPoint(int a = 0, int b = 0) : x(a), y(b) cout << " 생성자 1 : " << x << ", " << y << endl; CPoint(const CPoint &Po, int a, int b) x = Po.x + a; y = Po.y + b; cout << " 생성자 2 : " << x << ", " << y << endl; ~CPoint() cout << " 소멸자 : " << x << ", " << y << endl; void Print() cout << "(" << x << ", " << y << ")" << endl; ; CPoint GetPoint(CPoint Po) return CPoint(Po, 2, 2); // 임시객체생성및반환 6 장복사생성자 18

7. 임시객체 코드계속 int main(void) 명시적으로임시객체를만드는방법 à CPoint(1, 1) 임시객체는왜사라지지않는것일까? à 컴파일러의존적 : 형식매개변수인 Po 가임시객체를그대로사용하면됨 : GetPoint 함수에서 CPoint 객체가반환되는과정에서도똑같은원리가적용됨 à P1 은임시객체를그대로사용! CPoint P1 = GetPoint(CPoint(1, 1)); // GetPoint 함수호출 CPoint P2 = CPoint(100, 100); // 임시객체생성, P2 초기화 CPoint &P3 = CPoint(200, 200); // 임시객체생성, P3이참조 CPoint P4; // 일반생성 P4 = CPoint(300, 300); // 임시객체생성및대입 P1.Print(); 사실은앞서 CString 객체의반환예에서도 P2.Print(); CString str1 = GetString(); 의결과로 P3.Print(); 임시객체는소멸되지않고그대로 P4.Print(); str1으로사용됨 CPoint(300, 300).Print(); // 임시객체생성 & 멤버함수호출 cout << " 프로그램종료 " << endl; return 0; 임시객체의사용원리 - 필요한곳에서임시객체생성가능 : 명시적생성또는묵시적생성 - 임시객체의생성주기는임시객체가필요한기간과일치 6 장복사생성자 19