일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 포너블
- write up
- 시스템
- 시스템 프로그래밍
- C++
- 시스템프로그래밍
- 하드링크
- C언어
- pwncollege
- 컴퓨터구조
- 리버싱
- pwn.college
- 프로그래밍
- Leviathan
- 시스템해킹
- radare2
- 리눅스 커널
- css
- Bandit
- Pwnable.kr
- 시그널
- 리눅스
- 커널
- 리눅스커널
- kernel
- wargame
- 워게임
- multiplexing
- 알고리즘
- 어셈블리어
Archives
- Today
- Total
Computer Security
#3 C++ 생성자와 소멸자 본문
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");
}
결과 값
'프로그래밍 > 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