2009년 2월 5일 목요일

C/C== - 영 초기화(zero initialization)

 

출처 : http://blog.naver.com/jacking75/140057475052

[C/C++] 영 초기화(zero initialization)

 

C++에서 ‘영 초기화’(또는 기본값 초기화)라는 것을 들어보셨나요?

저는 이것을 근래에 알게 되었습니다. 그 전에는 이런 것이 있다는 것을 전혀 알지 못했습니다.

‘영 초기화’라는 것은 클래스(구조체)의 멤버들을 0으로 초기화 시켜주는 것을 말합니다.

#include <list>

#include <iostream>

using namespace std;

struct Item

{

int ItemCd;    // 아이템코드

int BuyMoney; // 판매금액

};

void main()

{

// 일반적인 할당 방식 입니다.

Item* item1 = new Item;

// Java나 C# 처럼 할당 합니다. 이렇게 하면 영 초기화가 됩니다.

Item* item2 = new Item();

// 물론 정적 할당도 됩니다.

Item item3 = Item();

cout << item1->ItemCd << endl;

cout << item2->ItemCd << endl;

cout << item3.ItemCd << endl;

}

결과

-842150451

0

0

그럼 구조체 Item에 vector와 같은 것이 있으면 어떻게 될까요 ?

vector가 있으면 영 초기화가 되지 않습니다.

struct Item

{

list< int > Datas;

int ItemCd; // 아이템코드

int BuyMoney; // 판매금액

};

void main()

{

Item* item1 = new Item;

Item* item2 = new Item();

Item item3 = Item();

cout << item1->ItemCd << item2->ItemCd << item3.ItemCd << endl;

}

결과

-842150451

-842150451

-842150451

만약 클래스(또는 구조체)가 다른 클래스를 포함한다면 어떨까요?

영 초기화가 됩니다.

struct Skill

{

int SkillCd;

int SkillKind;

};

struct Item

{

Skill skill;

int ItemCd; // 아이템코드

int BuyMoney; // 판매금액

};

void main()

{

Item* item1 = new Item;

Item* item2 = new Item();

Item item3 = Item();

cout << item1->ItemCd << endl;

cout << item2->ItemCd << endl;

cout << item3.ItemCd << endl;

}

결과

-842150451

0

0

그러나 Skill 구조체가 list와 같이 영 초기화를 할 수 없는 것을 포함하고 있다면 영 초기화가 되지 않습니다.

2년 반전부터 정기적으로는 C++ 공부를 하지 않았는데 요즘 다시 해야될 필요성을 느끼고 하고 있습니다. 생각해보니 예전보다 실력이 올랐기 때문에 지금 C++ 공부하면 예전보다 더 확실하고 빠르게 공부할 수 있는데 왜 안하고 있었는지 약간 의문스럽네요 ^^;;

댓글 없음: