S tr in g B a d S tr in g B a d S tr in g B a d S tr in g B a d 클 래 스 클 래 스 클 래 스 클 래 스
멤 버 에 포 인 터 사 용 – s tr
s ta ti c 멤 버 n u m _ s tr in g s – 단 하 나 만 생 성 됨
s ta ti c 클 래 스 멤 버 초 기 화 방 법 (7 1 3 쪽 )
–intStringBad::num_strings= 0;
–const나enum을사용하여클래스선언안에서초 기화(619쪽)
생 성 자 에 서 n e w [] 를 사 용 하 면 파 괴 자 에 서 d e le te [] 를 사 용
S tr in g B a d S tr in g B a d S tr in g B a d S tr in g B a d 클 래 스 클 래 스 클 래 스 클 래 스 사 용 사 용 사 용 사 용 시 의 시 의 시 의 시 의 문 제 점 문 제 점 문 제 점 문 제 점 ---- ve g n e w s .c p p ve g n e w s .c p p ve g n e w s .c p p ve g n e w s .c p p (7 1 7 (7 1 7 (7 1 7 (7 1 7 쪽쪽쪽쪽 ))))
callme2(headline2);
–값으로함수인자전달
–임시객체생성, 얕은복사수행
StringBadsailor = sports;
–새로정의하는객체에대입
–복사생성자를사용하거나, 복사생성자로임시객체생성 후대입연산자사용
–복사생성자, 대입연산자, 얕은복사수행
knot = headline1;
–다른객체에대입
–대입연산자사용, 얕은복사수행
디 폴 트 디 폴 트 디 폴 트 디 폴 트 생 성 자 생 성 자 생 성 자 생 성 자
어 떠 한 생 성 자 도 만 들 지 않 으 면 생 기 며 , 전 달 인 자 는 없 다
다 른 생 성 자 를 만 들 면 , 없 어 짐
명 시 적 으 로 디 폴 트 생 성 자 를 만 들 거 나
디 폴 트 전 달 인 자 를 사 용 하 여 구 현
개 선 방 안
–this->str= new char[1]; 로초기화함
복 사 복 사 복 사 복 사 생 성 자 생 성 자 생 성 자 생 성 자 (7 2 3 (7 2 3 (7 2 3 (7 2 3 쪽쪽쪽쪽 ))))
어떤객체를받아서그내용을그대로복사해서, 새로 운객체를생성
Class_name(constClass_name&);
StringBad(constStringBad&);
호출되는예
–StringBadditto(motto);
–StringBadmetoo= motto;
–StringBadalso = StringBad(motto);
–StringBad* pS= new StringBad(motto);
또한객체를함수의전달인자로값으로전달할때
복사생성자도생성자이므로new/초기화수행
대 입 대 입 대 입 대 입 연 산 자 연 산 자 연 산 자 연 산 자 (o p e ra to r= ) (7 2 8 (o p e ra to r= ) (7 2 8 (o p e ra to r= ) (7 2 8 (o p e ra to r= ) (7 2 8 쪽쪽쪽쪽 ))))
객체에다른객체를대입
Class_name& Class_name::operator=(const Class_name&);
StringBad& StringBad::operator=(const StringBad&);
호출되는예
–knot = headline1; –StringBadmetoo= knot; 문제해결방법
–자기자신에게대입하는바보짓처리 –왼쪽객체가가지고있는이전에할당된데이터를해제 –오른쪽객체의값을깊게복사 –호출한왼쪽객체에대한참조를리턴 보충(738쪽)
–StringBad& StringBad::operator=(const char *);
개 선 된 개 선 된 개 선 된 개 선 된 S tr in g S tr in g S tr in g S tr in g 클 래 스 클 래 스 클 래 스 클 래 스
friend booloperator<(const String&, const String&);
friend booloperator>(const String&, const String&);
friend booloperator==(const String&, const String&);
friend istream& operator>>(istream&, String&);
char& operator[](inti);
const char& operator[](inti); const
비 교 비 교 비 교 비 교 멤 버 멤 버 멤 버 멤 버 (7 3 4 (7 3 4 (7 3 4 (7 3 4 쪽쪽쪽쪽 ))))
friend booloperator<(const String& s1, const String& s2) { return (std::strcmp(s1.str,s2.str)<0); }
프렌드함수로String 객체와C 스타일문자열비교
–if (
“love
”==answer)
–if (operator==(
“love
”,answer)) // 프렌드함수
–if (operator==(String(
“love
”),answer)) // 생성자
[] [] [] [] 표 기 로 표 기 로 표 기 로 표 기 로 개 별 개 별 개 별 개 별 문 자 문 자 문 자 문 자 접 근 접 근 접 근 접 근 (7 3 5 (7 3 5 (7 3 5 (7 3 5 쪽쪽쪽쪽 ))))
S tr in g o p e ra ( “ T h e M a g ic F lu te ” );
o p e ra [4 ]
–opera[](inti)
–opera.operator[](4)
m e a n s [0 ] = ‘ r ’ ; // c o n s t 가 아 닌 o p e ra to r
–means.operator[](0) =‘r’;
–means.str[0] =‘r’;
c o n s t 객 체 를 위 해 c o n s t 멤 버 함 수 로 오 버 로 딩
s ta ti c s ta ti c s ta ti c s ta ti c 클 래 스 클 래 스 클 래 스 클 래 스 멤 버 멤 버 멤 버 멤 버 함 수 함 수 함 수 함 수
함 수 정 의 와 함 수 선 언 이 분 리 되 어 있 으 면 , s ta ti c 은 함 수 선 언 에 나 타 남
객 체 에 의 해 호 출 되 지 않 음
th is 포 인 터 도 없 음
클 래 스 이 름 과 사 용 범 위 연 산 자 (: :) 로 호 출
–intcount = String::HowMany();
s ta ti c 데 이 터 멤 버 만 사 용 가 능 , 아 니 면 내 부 적 으 로 객 체 생 성
객 체 객 체 객 체 객 체 리 턴 리 턴 리 턴 리 턴
객체, 객체참조, const 객체, const 객체참조
const 객체참조
–효율성(복사없음) –실행중에존재하는객체에대한참조 객체참조
–효율성(복사없음)과필요성 –연쇄적인대입이나출력 객체리턴
–복사생성자가사용되며, 리턴되는객체가로컬일때유용 const 객체리턴
–객체리턴이나참조리턴의오남용(752쪽)을막음 net = force1+force2; // 오케이 force1+force2 = net; // 이상한프로그래밍 cout<< (force1+force2 = net).magval() << endl; // 이상한프로그 래밍
n e w n e w n e w n e w 에에에에 의 한 의 한 의 한 의 한 객 체 의 객 체 의 객 체 의 객 체 의 초 기 화 초 기 화 초 기 화 초 기 화 (7 5 5 (7 5 5 (7 5 5 (7 5 5 쪽쪽쪽쪽 ))))
Class_name: 클래스이름, value가Type_name형
–Class_name* pC= new Class_name(value);
다음생성자를호출 –Class_name(Type_name); 다음생성자도가능(사소한변환) –Class_name(constType_name&); 모호성이없는한일반적인변환은가능
–예: int를double 로
디폴트생성자호출
–Class_name* pC= new Class_name
포 인 터 와 포 인 터 와 포 인 터 와 포 인 터 와 객 체 객 체 객 체 객 체
파괴자
–자동변수
–블록을벗어나면호출
–정적변수
–프로그램이종료될때호출
–동적변수
–new 로생성/ delete 될때호출
new로포인터초기화
–String* f = new String(myString);
디폴트생성자
–String* g = new String;
String(constchar *) 생성자
–String* f = new String(
“mymy my
”);
멤버에접근하려면->, 객체에접근하려면*
위 치 위 치 위 치 위 치 지 정 지 정 지 정 지 정 n e w n e w n e w n e w 다 시 다 시 다 시 다 시 보 기 보 기 보 기 보 기
메모리지정new, Placement new
placenew1.cpp (760쪽)
–동일한위치에위치지정new를두번한것
첫번째위치지정new의파괴자는호출되지않을것임 생성자나메소드가동적메모리할당을한다면더상황이나빠짐 –위치지정new로생성된객체들은파괴자를호출하지않음
메모리가중복되지않게한다
–p1 = new (buffer) JustTesting;
–p2 = new (buffer+sizeof(JustTesting)) JustTesting;
파괴자를명시적으로호출한다
–p1->~ JustTesting();
–p3->~ JustTesting();