카테고리 없음

2021-04-16 c++(생성자, 소멸자)

hyestar 2021. 4. 16. 12:47

#define _CRT_SECURE_NO_WARNINGS   //strcpy쓰려면 써줘야됨!!
#include <cstdio>
#include <cstring>

class student {
public: //원래 지역에서만 사용할 수 있는 변수였는데 public때문에 사용가능
//(public-어디서든 접근 가능, private-해당클래스에서만 접근가능, protected-해당클래스 + 자식클래스 접근가능, package-패키지 내에서 접근 가능 )
int std_no;
//char name[100];
char* name;
int gender;

student(int pstd_no, const char* n, int g) { //생성자 이름은 클래스 이름이랑 동일하게 해주면 된다. 생성자는 일반적으로 public안에 만들어주는게 좋다.
// 생성자를 지정해주는 이유는 500개 이상되면 그 정보를 다 지정해주기 힘드니깐 초기화 시켜주려고
std_no = pstd_no; //만약 std_no=std_no라고 하면 위의 변수로 접근을 못함 대신 this->std_no=std_no;이렇게 하면 클래스에 있는 멤버변수를 지정해주는 거라서 가능하다
//this 인스턴스는 현재인스턴스
//name = new char[100];
name = new char[strlen(n) + 1]; // +1은 널문자 포함하는 것.  이렇게하면 문자열에 딱맞는 배열이 만들어 진다.
strcpy(name, n);
gender = g;
}

//소멸자 : destructor =>앞에 ~붙음
~student() {
printf("%s의 소멸자 호출\n",name);
delete[] name; //동적으로 만들어진 name의 배열을 소멸시켜줘!!
}

/*
모든 동적 메모리를 수동으로 관리해줘야 하는 c++의 특성상 클래스 멤버 변수에
동적메모리 할당 된 개체가 있다고 할 경우 소멸자에서 처리하지 않으면 하나하나 클래스 외부에서
delete 전에 메모리를 해제해야 한다. -> 불편함과 불합리함을 초래하므로 소멸자를 사용한다.
*/

void printstudentInfo(){
printf("학생 번호 : %d\n", std_no);
printf("학생 이름 : %s\n", name);
printf("성별 : %s\n", gender == 0 ? "남자" : "여자");
//인라인 조건절 --> (조건절) ? 값1 : 값2
}


};

int main() {

//여기서 클래스 변수 s를 스택영역의 클래스 인스턴스라고 부른다
student s = student(1234, "홍길동", 0); //생성되자마자 초기화되는 것. 파라미터를 이용해서 값을 넣어줌
s.printstudentInfo();
//여기서 클래스 변수 ps를 인스턴스라고 부른다. 정확한 명칭은 힙영역의 클래스 인스턴스가 맞는말!!
student* ps = new student(2345, "홍길순", 1);
ps->printstudentInfo();
delete ps; //동적할당 받는 애들은 delete안해주면 소멸 불가
//s 같은 경우는 정적할당이므로 소멸자 사용시 소멸됨. 동적할당의 delete가 소멸자와 비슷한 역할을 한다.
return 0;
}

728x90