기반지식/C/C++2010. 6. 28. 21:28
☆ 생성자와 소멸자

  - 생성자 : 객체가 생성되는 시점에서 자동으로 수행되는 멤버 함수. 오버로딩이 가능.
  - 소멸자 : 객체가 소멸되는 시점에서 자동으로 호출되는 멤버 함수. 오버로딩 불가.
  - 둘 다 사용자가 호출하는게 아니며 자동적으로 호출된다
  - 리턴값이 없다
  - 함수의 이름이 클래스의 이름과 동일하다
  - 주로 멤버 변수의 초기화나 메모리 할당에 사용된다

#include <iostream.h>
#include <string.h>

class Sinsang
{
private:
//char name[10];   // 클래스 안에서 구체적으로 배열의 길이를 선언해주고 있지만 이것이 안될 경우
char *name;          // 배열을 사용해서 임의의 길이로 문자열을 설정할 수 있도록 한다.
int age;
public:
Sinsang(); //생성자
Sinsang(char *n); // 윗줄과 이름은 똑같지만 파라미터가 틀리므로 오버로딩임.
Sinsang(char *n, int age);

~Sinsang(); //소멸자. 앞에 ~ 가 붙으면 소멸자이다
void Disp() const;
};

Sinsang::Sinsang()
{
// cout << "디폴트 생성자 호출 \n";
name = new char[10]; // 생성자 안에서 배열(문자열)의 길이를 설정한다.
strcpy(name,"디폴트");
age=0;
}

Sinsang::~Sinsang()
{
cout << "소멸자 호출 -> " << name << "\n";
delete name;
}

Sinsang::Sinsang(char *n)
{
// cout << n << "생성자 호출\n";
name = new char[strlen(n)+1]; // 생성자의 호출 타입이 오버로딩으로 달라져 있으므로 
                                                    // 메모리 할당도 다르게 된다. NULL 문자 때문에 문자열 길이 +1이 된다.
strcpy(name,n);
age=0;
}

Sinsang::Sinsang(char *n, int age)
{
name = new char[strlen(n)+1];
strcpy(name,n);
this->age=age;
}

void Sinsang::Disp() const
{
cout << "이름 : " << name << endl;
cout << "나이 : " << age << endl;
}

void main()
{
/*
Sinsang s; // 디폴트 생성자 호출
Sinsang s2("송혜교");
Sinsang s3("한은정",23);
s.Disp();
s2.Disp();
s3.Disp();
*/

Sinsang *s=new Sinsang();
Sinsang *s2=new Sinsang("송혜교");
Sinsang *s3=new Sinsang("한은정",23);

s->Disp();
s2->Disp();
s3->Disp();

delete s3;
delete s2;
delete s;
}


☆ 정적 데이터 멤버



Posted by windship