C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[14846] [재미] 생성자, 해제자, 할당자의 잼있는 얘기
이경문 [gilgil] 3407 읽음    2008-07-19 01:58
static int con_cnt; // 객체의 생성자가 불릴 때 증가되는 카운트
static int des_cnt; // 객체의 해제자가 불릴 때 증가되는 카운트
static int asn_cnt; // 객체의 할당자가 불릴 때 증가되는 카운트

void clear()
{
  con_cnt = 0; des_cnt = 0; asn_cnt = 0; // 모든 카운트 변수를 초기화한다.
}

class Object
{
public:
  Object()                    { con_cnt++; } // 객체가 생성될 때 con_cnt 값을 증가시킨다.
  virtual ~Object()           { des_cnt++; } // 객체가 해제될 때 des_cnt 값을 증가시킨다.
  void operator=(Object& obj) { asn_cnt++; } // 객체가 할당될 때 asn_cnt 값을 증가시킨다.
};

//
// foo1, foo2, foo3 에서 각각은 생성자, 해제자, 할당자는 몇번씩 불릴까?
//

void foo1()
{
  Object obj1;
  Object obj2;
  Object obj3;

  obj2 = obj1;
  obj3 = obj1;
}

void foo2()
{
  Object obj1;
  Object obj2 = obj1;
  Object obj3;

  obj3 = obj1;
}

void foo3()
{
  Object obj1;
  Object obj2 = obj1;
  Object obj3 = obj1;
}

int main(int argc, char* argv[])
{
  // foo1 함수를 불렀을 때 카운트를 확인해 본다.
  clear();
  foo1();
  printf("foo1 con=%d des=%d asn=%d\n", con_cnt, des_cnt, asn_cnt);

  // foo2 함수를 불렀을 때 카운트를 확인해 본다.
  clear();
  foo2();
  printf("foo2 con=%d des=%d asn=%d\n", con_cnt, des_cnt, asn_cnt);

  // foo3 함수를 불렀을 때 카운트를 확인해 본다.
  clear();
  foo3();
  printf("foo3 con=%d des=%d asn=%d\n", con_cnt, des_cnt, asn_cnt);
}



------------------- 결과 -------------------
foo1 con=3 des=3 asn=2
foo2 con=2 des=3 asn=1
foo3 con=1 des=3 asn=0



------------------- 결론 -------------------

C++ 클래스 라이브러리를 만들다가 이것때문에 열라 고생했습니다. 아, 이거 왜 이러는 걸까요? 언어 디자인의 ambiguity 문제인지, 컴파일러 디자인 잘못인지, 단순한 버그인지, 아니면 무슨 모르는 심오한 뜻이 내포되어 있는 것인지... ㅠㅠ 저는 잘 모르겠습니다.

암튼 일단 잠정적으로 내린 결론은 다음과 같습니다.

"객체를 선언할 때에 선언자체에서 할당자(assignment 연산자)를 사용하게 되면, constructor  및 assignment 연산자(= operator) 메소드(함수)는 호출되지 않는다. 단 이경우 객체의 단순한 복사는 자동으로 이루어 진다."

테스트 파일 예제는 다음 URL에서... ^^

http://www.gilgil.co.kr/bbs/view.php?id=lecture&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=673
이경문 [gilgil]   2008-07-19 06:37 X
윽, copy constructor라는 개념이 있었군요. 야매로 C++을 공부해서 이런 기초적인 것도 몰랐었네요. ㅠㅠ 언제 C++ 책 정독을 함 해 봐야 겠습니다.  좋은 책 없나요? 추천해 주심 감사. ^^
김상면 [windyboy]   2008-07-19 12:33 X
흨.....
야메라....
저도 야메로 공부했는데.....

글쎄요 정독 할려면 책이 있을라나...
c/C++은 사람 웃기는게 어느정도 터를 닦아놓으면...
뭔가 툭 티어 나와서 또 공부하게 만듭니다.
한마디로 사람 허파 뒤집습니다.

그리고 C/C++은 빌더나 델파이 처럼 래드 툴이 아니라서 마스터 해봐야 별로 써 먹을때가 없습니다. 요즘은 그 흔한 데이터 베이스도 sql을 공부해야 사용가능합니다.
장비 제어를 할래도 해당 장비와 ASM을 알아야 하고...
좀 포질나게 만들려면 WIN32에 대해서 알아야 하고.....
좀 감칠나게 만들려면 하다 못해 MCI라도 알아야 하고....
한마디로 완벽하게 공부해 봐야 별로 쓸데가 없습니다. 요즘은....

그래도 다행인게 기초가 튼튼한 사람이라면 그 응용분야가 무궁무진 하다는 겁니다.
알고리즘 책 하나만 마스터 해도 대부분의 프로제트에 투입 될수 있고....
그래픽에 대해서 좀만 공부하면 ui는 쉽게 만든다는 겁니다.
물론 DB는 거져 먹기죠....

그리고 UNIX에 아주 친해서 네트웤 프로그램에도 상당히 강력하다는 겁니다.
지금까지 UNIX에서 C/C++보다 강력한 툴은 아직 보지 못했습니다.
제가 공부한 봐로는 UNIX에서 C/C++로 네트워크 제어는 거져 먹기입니다.
물론 해당 분야의 지식이 필요 하지만....

한미디로 말해서 기초가 없는 사람은 해 봐야 두루아미 타불이지만....
기초 탄탄하다면 하루 빨리 공부해야 하는 툴이라고 생각합니다....

그럼
이경문 [gilgil]   2008-07-19 13:52 X
학교 졸업한 이후로 마음먹고 하나의 주제에 대해 근~하게 공부해 본 적이 없었던 것 같네요. 공부는 재미있는데, 일하기는 싫은건 왜일까요? ㅋㅋ
아루스 [tinydew4]   2008-07-20 22:26 X
흠... copy constructor 도 자동으로 생기는 것이었습니까? ㄷㄷㄷ
아제나 [azena]   2008-07-21 14:02 X
LVAUE 보다 RVALUE가 먼저 실행되기 때문에 메모리가 할당되기도 전에
= opreator가 실행되므로 선언 부분에서는 =를 무시하도록 되어 있는 모양인데요...

believe it or not -_-

+ -

관련 글 리스트
14846 [재미] 생성자, 해제자, 할당자의 잼있는 얘기 이경문 3407 2008/07/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.