Post on 08-Aug-2020
transcript
C++ 프 그래밍 문
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) 형변환 후 초 화
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;}
객체 생 과 객체
별하고
객체 생 에
반 생 과 복사 생
별하라.
6 복사 생 3
1. 객체 생 과
객체 복사 생 과
n 복사 생 : 생 (그 에 복사 생 )가 동 함
n : 연산 가 동 함
복사 생 과 연산 폴트 동
n 버 단 복사!
n 폴트 동 방식 동
n 버 단 복사만 충 한가? à 다 페 제
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 )
6 복사 생 5
1. 객체 생 과
CString 클래스 문제점
CString str2 = str1; 수행 결과
str3 = str1; 수행 결과
든 객체 *str 동 한
주 가 킴
à함수 종료 시 각 객체에 한
가 수행 다 !
동 한 주 에 한 delete 시
à에러 발생!
à복사 생 과 연산 문제!
해결 방안 : 복사생 – 6.3~6.5절, – 7.10절
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;}
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 수행à에러
6 복사 생 8
3. 복사 생
복사 생
n 복사 생 시 호출 는 특수한 생
n 복사 생 양 추
Ø 반 생 : CPoint P1(3, 4); à CPoint(int a, int b);
Ø복사 생 : CPoint P2(P1); à CPoint(CPoint Po); // ok???
ü 문제점 : 복사 생 해 P1 매개변수 전달 시 또 다사 복사 생 발생
복사 생 무한히 반복
수행
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;}
복사 생
반 생
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;
}
6 복사 생 11
5. 복사 생 정
다 드에 한 바 동 ?
CString str1 = "C++ Programming";
CString str2 = str1;
폴트 복사 생
사 하는경
호출 시
에러 발생
원하는 동
à 에 맞게 복사 생
정 !
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;}
복사 생
반 생
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;}
6 복사 생 14
6. 객체 값에 한 반환
CPoint 객체 반환 동 원
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;}
에러가 발생하는 것 ?
à객체 반환에 복사 생
6 복사 생 16
6. 객체 값에 한 반환
CString 객체 반환 시 에러 발생 원
역 객체 str과 시 객체가
동 한 가 킴
str에 한 호출 후
시 객체에 한 호출
시 에러 발생!
6 복사 생 17
6. 객체 값에 한 반환
CString 객체 반환 문제점 해결
n 복사 생 만 ok!
CString(const CString &string) {
len = string.len;
str = new char[len + 1];
strcpy(str, string.str);
}
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); // 임시객체 생 및 반환}
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 사