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

6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

C++ 프 그래밍 문

6 복사 생

객체 생 과

객체 값에 한 전달

복사 생

폴트 복사 생

복사 생 정

객체 값에 한 반환

시 객체

Page 2: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 1

1. 객체 생 과

int형 변수 : 언과 동시에 초 화하는 방법 (C++)

n int a = 3;

n 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();

return 0;}

반적 방법

객체 배열 생 시 주 사

CPoint(5) 형변환 후 초 화

Page 3: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 2

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;}

객체 생 과 객체

별하고

객체 생 에

반 생 과 복사 생

별하라.

Page 4: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 3

1. 객체 생 과

객체 복사 생 과

n 복사 생 : 생 (그 에 복사 생 )가 동 함

n : 연산 가 동 함

복사 생 과 연산 폴트 동

n 버 단 복사!

n 폴트 동 방식 동

n 버 단 복사만 충 한가? à 다 페 제

Page 5: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 4

1. 객체 생 과

: 문 열 다루 한 CString 클래스 현

#include <iostream>#include <cstring> // strlen, strcpy 함수using namespace std;

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; }

};

int main(void){

CString str1 = "C++ Programming";CString str2 = str1; // 복사 생CString str3;

str3 = str1; // 입 연산

str1.Print();str2.Print();str3.Print();

return 0;}

언제, 어 에러가 발생하는 것 ?

str3 = str1 + str2; // 가능하 ?

à연산 버 (7 )

Page 6: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 5

1. 객체 생 과

CString 클래스 문제점

CString str2 = str1; 수행 결과

str3 = str1; 수행 결과

든 객체 *str 동 한

주 가 킴

à함수 종료 시 각 객체에 한

가 수행 다 !

동 한 주 에 한 delete 시

à에러 발생!

à복사 생 과 연산 문제!

해결 방안 : 복사생 – 6.3~6.5절, – 7.10절

Page 7: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 6

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;}

Page 8: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 7

2. 객체 값에 한 전달

: 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; }

};

void ShowString(CString str) // 값에 의한 전달{

str.Print();}

int main(void){

CString str1 = "C++ Programming";ShowString(str1);

return 0;}

1. str 수행

2. str1 수행à에러

Page 9: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 8

3. 복사 생

복사 생

n 복사 생 시 호출 는 특수한 생

n 복사 생 양 추

Ø 반 생 : CPoint P1(3, 4); à CPoint(int a, int b);

Ø복사 생 : CPoint P2(P1); à CPoint(CPoint Po); // ok???

ü 문제점 : 복사 생 해 P1 매개변수 전달 시 또 다사 복사 생 발생

복사 생 무한히 반복

수행

Page 10: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 9

3. 복사 생

복사 생 양

n CPoint(CPoint &Po); // 참조에 한 전달!

n 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;}

복사 생

반 생

Page 11: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 10

4. 폴트 복사 생

동 생 는 버 함수

n 폴트 생 : 4.7절

n 폴트 : 4.7절

n 폴트 복사 생 : 본 절

n 폴트 연산 : 7.10절

폴트 복사 생

n 버 단 복사

n : CPoint

n 복사 생 시적 만드는 경

Ø 폴트 복사 생 사라짐

Ø 폴트 생 역시 사라짐

CPoint(const CPoint &Po)

{

x = Po.x;

y = Po.y;

}

Page 12: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 11

5. 복사 생 정

다 드에 한 바 동 ?

CString str1 = "C++ Programming";

CString str2 = str1;

폴트 복사 생

사 하는경

호출 시

에러 발생

원하는 동

à 에 맞게 복사 생

정 !

Page 13: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 12

5. 복사 생 정

CString 클래스에 한 복사 생 정

class CString {private :

int len;char *str;

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;}

복사 생

반 생

Page 14: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 13

6. 객체 값에 한 반환

복사 생 가 호출 는 경

n 객체 언 및 초 화 : CPoint P2(P1);

n 객체 값에 한 전달 : void ShowString(CString str) { … }

n 객체 값에 한 반환 : 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); // 지역 객체 Po 생return Po; // 지역 객체값 반환

}

int main(void){

CPoint P1 = GetPoint(); // GetPoint 함수 호출P1.Print();

return 0;}

Page 15: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 14

6. 객체 값에 한 반환

CPoint 객체 반환 동 원

Page 16: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 15

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; // 객체값 반환, 임시객체 생

}

int main(void){

CString str1 = GetString(); str1.Print();

return 0;}

에러가 발생하는 것 ?

à객체 반환에 복사 생

Page 17: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 16

6. 객체 값에 한 반환

CString 객체 반환 시 에러 발생 원

역 객체 str과 시 객체가

동 한 가 킴

str에 한 호출 후

시 객체에 한 호출

시 에러 발생!

Page 18: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 17

6. 객체 값에 한 반환

CString 객체 반환 문제점 해결

n 복사 생 만 ok!

CString(const CString &string) {

len = string.len;

str = new char[len + 1];

strcpy(str, string.str);

}

Page 19: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 18

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); // 임시객체 생 및 반환}

Page 20: 6장복사생성자 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP06_Copy Constructor.pdfC++ 프로그래밍입문 6장복사생성자 객체의생성과대입 객체의값에의한전달

6 복사 생 19

7. 시 객체

드 계

int main(void)

{

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();

P2.Print();

P3.Print();

P4.Print();

CPoint(300, 300).Print(); // 임시객체 생 & 멤버 함수 호출

cout << "프로그램 종료" << endl;

return 0;

}

시 객체 사 원

- 필 한 곳에 시 객체 생 가능

: 시적 생 또는 묵시적 생

- 시 객체 생 주 는 시 객체가

필 한 간과 치

시적 시 객체 만드는 방법

à CPoint(1, 1)

시 객체는 사라 않는 것 ? à컴파 러 존적

: 형식매개변수 Po가 시 객체 그 사 하

: GetPoint 함수에 CPoint 객체가 반환 는 과정에

똑 같 원 가 적 à P1 시객체 그 사 !

사실 앞 CString 객체 반환 에

CString str1 = GetString(); 결과

시 객체는 않고 그

str1 사