본문 바로가기

C 언어/C++

c++ 기초단계 (11/18)

 

생성자, 복사생성자, 대입연산자 안만들면 자동구동 –> 바이너리복사 되서 문제 생김

 

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

}

시험출력

함수

진짜출력

rprint 

 

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;

}

rprint_00000

 

cout << obj << endl;을 하면

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