Computer Security

#3 C++ 생성자와 소멸자 본문

프로그래밍/C++

#3 C++ 생성자와 소멸자

쿠리 Kuri 2022. 6. 14. 18:30

C++의 생성자
-C++에서는 생성자(Constructor)를 이용해 객체를 생성함과 동시에 멤버 변수를 초기화할 수 있다.

-생성자는 특별한 메소드로, 클래스의 이름과 동일한 이름의 메소드로 구현된다.
-생성자는 반환 값이 없다. 생성자는 여러 번 정의되어 다양한 방법으로 객체를 초기화할 수 있다.

 

코드 예시

#include <iostream>
#include <string>

using namespace std;

class Character {
private:
	string name;
	int ragePoint;
	int hp;
	int damage;
public:
	Character(string n, int h, int d) {
		this->name = n;
		this->ragePoint = 0;
		this->hp = h;
		this->damage = d;
	}
	void show() {
		cout << name << "[" << ragePoint << "]" << hp << " " << damage << "\n";
	} //this 포인터로 name 안에 n을 넣었다. 따라서, show에서 쓸 때는 n 이아니라 name을 cout 안에 넣어줘야한다.
};

int main(void) {
	Character character = Character("슬라임", 50, 10);  
	//클래스 Character 안에 character라는 객체를 만들고, 그 객체는 Character 함수안에 정의된다.
	character.show();
	system("pause");
}

 

결과 값


C++의 기본 생성자
C++에서 별도로 생성자를 구현하지 않으면 기본 생성자(Default Constructor)가 사용된다.

기본 생성자는 매개변수를 가지지 않으며 멤버 변수는 0, NULL 등의 값으로 초기화된다.

 

코드 예시

#include <iostream>
#include <string>

using namespace std;

class Character {
private:
	string name;
	int ragePoint;
	int hp;
	int damage;
public:
	void show() {  //아까와 달리 별 다른 입력값이 없다.
		cout << name << "[" << ragePoint << "]" << hp << " " << damage << "\n";
	} 
};

int main(void) {
	Character character = Character();
	//아까는 슬라임이 들어가있었지만, 지금은 빈 공간이다.
	character.show();
	system("pause");
}

결과 값


C++의 복사 생성자
-C++는 복사 생성자(Copy Constructor)는 다른 인스턴스의 참조(Reference)를 인수로 받아서, 그 참조를 이용해
자신의 인스턴스를 초기화할 수 있도록 해준다.

-대표적인 복사 방법인 깊은 복사(Deep Copy)를 이용해 만들어진 인스턴스는 기존의 인스턴스와 다른 메모리 공간에 할당되어 독립적이다.

 

코드 예시

#include <iostream>
#include <string>

using namespace std;

class Character {
private:
	string name;
	int ragePoint;
	int hp;
	int damage;
public:
	Character(string name, int hp, int damage) : name(name), ragePoint(0), hp(hp), damage(damage) { }
	Character(const Character& other) {
		//other 또다른 캐릭터 인스턴스를 매개변수로 입력받아 그 아더의 name값을 자신의 name값으로 초기화시킨다.
		name = other.name;
		ragePoint = other.ragePoint;
		hp = other.hp;
		damage = other.damage;
	}
	void pointUp() { ragePoint++; }  
	//분노게이지를  1증가 시킨다.
	void show() {
		cout << name << "[" << ragePoint << "] " << hp << " " << damage << '\n';
	}
};

int main(void) {
	Character character1("슬라임", 10, 20); //캐릭터1생성
	character1.pointUp(); //캐릭터1 분노게이지 1증가
	Character character2(character1); //캐릭터2에 캐릭터1의 현재상태 복사
	character2.pointUp(); //캐릭터2에서 분노게이지 1증가(그럼 총1+1=2인상황)
	character1.show();
	character2.show();
	system("pause");
}

 

결과 값


C++의 소멸자
-C++의 소멸자(Destructor)는 객체의 수명이 끝났을 때 객체를 제거하기 위한 목적으로 사용된다.

-객체의 수명이 끝났을 때 자동으로 컴파일러가 소멸자 함수를 호출한다.
-C++의 소멸자 또한 생성자처럼 클래스의 이름과 동일하며 물결 기호(~)를 이용해 정의할 수 있다.

 

코드 예시

#include <iostream>
#include <string>

using namespace std;

class Character {
private:
	string name;
	int ragePoint;
	int hp;
	int damage;
public:
	Character(string name, int hp, int damage) : name(name), ragePoint(0), hp(hp), damage(damage) { }
	~Character() {
		cout << "[객체가 소멸됩니다.]\n";
	}
	void pointUp() { ragePoint++; }
	void show() {
		cout << name << "[" << ragePoint << "] " << hp << " " << damage << '\n';
	}
};

int main(void) {
	Character* character1 = new Character("슬라임", 10, 20);
	//동적할당시에 포인터 처리
	character1->pointUp();
	Character character2(*character1);
	character2.pointUp();
	character1->show();
	character2.show();
	delete character1; // 동적 할당을 이용했으므로 성공적으로 소멸됨( ~ 함수 호출됨)
	delete& character2; // 동적 할당을 이용하지 않았으므로 오류가 발생함 (끝나지않음)
	system("pause");
}

 

결과 값

delete& character2; // 동적 할당을 이용하지 않았으므로 오류가 발생함 (끝나지않음)

 

'프로그래밍 > C++' 카테고리의 다른 글

#6 C++ 프렌드  (0) 2022.06.17
#5 C++ 오버로딩  (0) 2022.06.16
#4 C++ 클래스 상속  (0) 2022.06.15
#2 C++의 클래스  (0) 2022.06.13
#1 C언어와 C++비교하기  (0) 2022.06.12
Comments