malloc , free
<>
new , delete
new :
Type* name = new Type;
배열 : new Type[size];
delete :
delete name;
배열 : delete[] name; // size 안넣어줘도됨
객체 : 변수들, 참고 자료들로 이루어진 소프트웨어 덩어리
내가 함수속에 들어가는것이 아닌 > 절차지향 (procedure :: 각 함수 들을 걸쳐감)
내가 함수를 실행한다. > 객체지향 (object :: 각 객체가 함수를 실행)
private :
객체가 함수를 통해 변수를 변경한다.
> 객체외의 존재 (프로그래머 포함 + instance)는 접근할수없다
public :
객체 외에서 (instance에서도) 접근 가능
// 선언: class, 구현: instance
> 변수가 private 라면..
public 에있는 함수로 변수를 지정해줘야함
>>
private:
int food;
int weight;
public:
void set_animal(int _food, int _weight) {
food = _food;
weight = _weight;
}
OverLoading
: 함수의 이름이 같아도 Type이 다르면 쓸 수 있음
>
생성자
Date() {
std::cout << "기본 생성자 호출!" << std::endl;
year_ = 2012;
month_ = 7;
day_ = 12;
}
Date(int year, int month, int day) {
std::cout << "인자 3 개인 생성자 호출!" << std::endl;
year_ = year;
month_ = month;
day_ = day;
}
Date(); // default
<>
Date(int year,int month, int dat) { ~~~ }
>
Date day1(2012, 3, 4);
Date day2(2015, 3, 5);
Date day3(2016, 6,7);
>> 하나의 생성자 함수로 여러개의 초기화 가능!
Constructor : 생성자
class 내부에
: classname ( 인자 ) { }
사용 :
: classname name ( 값 );
: classname name = classname( 값) ;
default 생성자
Date day; , day() = default; 생성만 되고 값 X
Date() {
year_ = 2012;
month_ = 7;
day_ = 12;
}
> 생성 + default 값 생김
marines[0] = new Marine(2, 3);
C++ 의 동적할당 :: 메모리 공간 할당+ 생생자 호출 가능 !
물론 그 공간은 주소이므로 : " -> "
marines[0]->show_status();
Destructor : 소멸자
: ~classname
main이 끝나면 자동소멸해줌
복사 생성자 // 생성시에 호출
: Type (const Type& name);
> const 타입이라 변경 불가, 복사만 가능
hp = pc.hp;
shield = pc.shield;
coord_x = pc.coord_x;
>
Photon_Cannon pc1(3, 3);
Photon_Cannon pc2(pc1);
Photon_Cannon pc3 = pc2;
> 100개가 넘는 똑같은 pc1의 값을 같는 pc2,3,4,5,6,67,88 들을 만들 수 있음
//photon_cannon pc3 = pc2 == photon_cannon pc3(pc2);
/* BUT
photon_cannon pc3;
pc3= pc2; 는 X
> 호출시에만 가능함!
*/
deep copy
name = new char[strlen(cannon_name) + 1];
1. name 동적할당
Photon_Cannon::~Photon_Cannon()
2. main 종료시 소멸
{
if (name) delete[] name;
3. name 이 있다면 delete
}
Photon_Cannon pc2 = pc1;
4. 복사 생성
>
a) name 동적 공간까지 복사 > 같은 메모리를 가르킴 : 여기까진 OK
b) 소멸시..
b-1) pc1에서 소멸
b-2) pc2에서 소멸 > run-time error !
> 소멸한곳을 접근,재해제 불가함
>> name은 각 pc에서 따로 할당 해주어야함
Photon_Cannon::Photon_Cannon(int x, int y, const char *cannon_name) {
hp = shield = 100;
coord_x = x;
coord_y = y;
damage = 20;
name = new char[strlen(cannon_name) + 1];
strcpy(name, cannon_name);
}
복사 생성자 안에서 따로 만들어주기
Initializer list
Marine::Marine() : hp(50), coord_x(0), coord_y(0), damage(5), is_dead(false) {}
> Marine() 을 생성
+
hp에 해당하는 변수에 50, coord_x 에는 0 , coord_y 에는 0 등등 으로 초기화 해줌
hp = 50;
coord_x = coord_y = 0;
damage = 5;
상수, 레퍼런스들은 모두 생성과 동시에 초기화가 되어야함
> 생성 후 선언하면 생성할때 값이 const 되기에 오류발생
// const 를 사용 > 프로그래머 오류에 의한 무의미 디버깅 시간 절약 가능
const static int i = 0;
// private 내에서 선언과 동시에 구현까지 하는방법
Static member
static int total_marine_num;
class 내 private 에 선언
int Marine::total_marine_num = 0;
public 에 구현
+
static 함수
static void show_total_marine();
void Marine::show_total_marine() {
std::cout << "전체 마린 수 : " << total_marine_num << std::endl;
}
> 어떤 객체에 속한것이 아닌, class 에 속함
> 불러오는 total_marine_num 도 static 이여야함
This : 자기 자신을 가르키는 포인터