생성자, 복사생성자, 대입연산자 안만들면 자동구동 –> 바이너리복사 되서 문제 생김
void init(classtype & r)
{
a = r.a;
b = r.b;
…
}
이 함수를 한줄에 해결하는 방법
inline void init(classtype & r)
t = 1; <- int형 대입연산자
a = b;
void operator = (classtype &)
a = b = c;
class::operator = (clastype &)
/////////////////////////////////////////////////////////
main()함수에는
test();
만 호출하고
void test()
{
emb obj;
}
생성자 호출
소멸자 호출
위에 함수를 바꿔
emb test()
{
emb obj;
return obj;
}
생성자 호출
복사생성자 호출
소멸자호출
소멸자호출
이번엔 main()내에
emb obj;
obj = test();
emb & test()
{
emb obj;
return obj;
}
생성자 호출
생성자 호출
대입연산자 호출
소멸자 호출
소멸자 호출
return될 때 객체가 생성
원본 생성은 함수에서 소멸
카피 생성은 메인에 와서 소멸
= <—이걸 대입연산자라 하면 << <—출력연산자라 한다
예) cout << a;
cout도 클래스이다.(출력클래스)
void print()
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
변경
void print(ostream * o)
{
*o << a << endl;
*o << b << endl;
*o << c << endl;
}
int main()
{
emb obj;
obj.test();
return 0;
}
cout도 *로 가르킬 수 있다.
연산자는 함수다.
cout << “a\n”;
컴파일러는 수식 cout << “a\n”을 함수구동으로 해석
operator << (cout, “a\n”); //cout << “a\n”; 컴파일러가 번역
void operator<<(ostream & o, emb & r)
{
cout <<” 연산자 호출됨” << endl; //시험출력
r.printf(&o); //진짜 출력(여기에 &은 참조가 아니라 주소)
}
int main ()
{
emb obj;
cout << obj; // <=> operator<<(cout, obj);
}
시험출력
진짜출력
emb에게 상속받은 IT클래스도 시험을 해봄
void operator<<(ostream & o, IT & r)
{
cout <<” 연산자 호출됨” << endl; //시험출력
r.printf(&o); //진짜 출력
}
int main ()
{
emb obj;
IT obj1;
cout << obj; // <=> operator<<(cout, obj);
cout << obj1;
}
cout << obj << endl;을 하면
에러 메시지 출력 이유는 return값이 다르기 때문이다
cout는 ostream의 타입인데 void로 하였기 때문에 맞지않다
그래서
void operator<<……을
ostream & operator <<……으로 바꿔주면 형식에 맞기에 제대로 컴파일된다.
참고로 return 값은 o를 해야함.
'C 언어 > C++' 카테고리의 다른 글
c++ 기초단계 (11/22) (1) | 2011.11.23 |
---|---|
c++ 기초단계 (11/21) (0) | 2011.11.21 |
c++ 기초단계 (11/16) (0) | 2011.11.16 |
c++ 기초단계 (11/15) (0) | 2011.11.15 |
c++ 기초단계 (11/14) (0) | 2011.11.14 |