C++/모두의코드

3장, 4장

twoweeks-within 2025. 1. 30. 14:30

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 : 자기 자신을 가르키는 포인터

'C++ > 모두의코드' 카테고리의 다른 글

7장  (0) 2025.02.04
6장  (0) 2025.02.02
5장 // 5.3 뒷부분은 복습때  (0) 2025.02.01
4장 이어서..  (0) 2025.01.31
1장  (0) 2025.01.29