생성자와 소멸자

이승덱·2021년 7월 21일

CPP

목록 보기
28/70
#include <iostream>

#include<iomanip>

using namespace std;

//생성자(Constructor)와 소멸자(Destructor)

//클래스에 '소속'된 함수들을 멤버 함수라고함

//이 중에서 굉장히 특별한 함수 2종이 있는데. 바로 [시작]과 [끝]을 알리는 함수들

//- 시작(탄생)-> 생성자 (여러개 존재 가능)

//- 끝(소멸)-> 소멸자 (오직 1개만)

//암시적(inplicit) 생성자 (컴파일러가 자동으로 만들어준 생성자)

//생성자를 명시적으로 만들지 않으면 아무 인자도 받지 않는 기본 생성자가 자동으로 만들어짐

//그러나 우리가 명시적(Explicit)으로 아무 생성자 하나 만들면,

//자동으로 만들어지던 [기본 생성자]는 더 이상 만들어지지 않는다.

//class는 일종의 설계도이다.

class Knight {

public:

 //[1]기본 생성자(인자가 없음)

 Knight(){

 cout << "Knight() 기본 생성자 호출" << endl;

 _hp = 100;

 _attack = 10;

 _posY = 0;

 _posX = 0;

 }

 //[2]복사 생성자(자기 자신의 클래스 참조 타입을 인자로 받음)

 //일반적으로 '똑같은' 데이터를 지닌 객체가 생성되길 기대함

 Knight(const Knight& knight) {

 cout << "Knight() 복사 생성자 호출" << endl;

 _hp = knight._hp;

 _attack = knight._attack;

 _posY = knight._posY;

 _posX = knight._posX;

 }

 //[3]기타 생성자(기본 생성자와 복사 생성자를 제외한 모든 생성자)

 //이 중에서 인자를 1개만 받는 [기타 생성자]를

 //[타입 변환 생성자]라고 부르기도 함

 //explicit을 앞에 붙일 경우 명시적인 용도로만 사용할 수 있음!

 explicit Knight(int hp) {

 cout << "Knight() 타입 변환 생성자 호출" << endl;

 _hp = hp;

 _attack = 10;

 _posY = 0;

 _posX = 0;

 }

 //소멸자(인자가 없음)

 ~Knight() {

 cout << "Knight() 소멸자 호출" << endl;

 }

 void Move(int y, int x);

 void Attack();

 void Die() {

 this->_hp = 0;

 cout << "Die" << endl; 

 }

public:

 int _hp;

 int _attack;

 int _posY;

 int _posX;

};

void Knight::Move(int y, int x){

 cout << "Move " <<"x: "<<x<<" y: "<<y<< endl;

}

void Knight::Attack(){

 cout << "Attack " << _attack << endl;

}

void HellowKnight(Knight k) {

 cout << "Hello" << endl;

}

int main()

{

 Knight k1;

 Knight k2(80);

 Knight k3 = k1;

 Knight k5;

 k5 = (Knight)1; //명시적으로 표현해 줘야지 가능

 k3.Move(2, 2);

 k3.Attack();

 k3.Die();

 //암시적 형변환 -> 컴파일러가 알아서 바꿔치기함

 int num = 1;

 float f = num;

 //명시적 형변환

 f = (float)num;

 HellowKnight((Knight)5);

 return 0;

}
profile
공부 기록용 블로그입니다

0개의 댓글