본문 바로가기
Language/C++

[c++][씹어먹는 c++] 4.4 스타만들기(const, static)

by 담백로봇 2024. 4. 22.

https://modoocode.com/197


주제:

  • 생성자 초기화 리스트(initializer list)
  • 클래스의 const, static 변수
  • 레퍼런스 타입을 리턴하는 함수
  • this 포인터
  • const 멤버 함수

initializer list

  • [정의] 초기화 리스트(initializer list) 는 생성자 호출과 동시에 멤버 변수들을 초기화
    •  
    • (생성자 이름) : var1(arg1), var2(arg2) {}
  • [사용이유] 생성자 초기화 리스트는 생성과 초기화를 동시해 하게 된다. (1)상수나 (2)레퍼런스 들은 모두 생성과 동시에 초기화가 필요하므로 이때는 반드시 초기화리스트로. => 호출하고 대입하는것과 비교하면 좀 더 효율적임

 


static

  • [정의] static 은 클래스에서 전역 변수처럼 쓰이는것으로 객체가 늘어나도 똑같은 변수를 사용한다.
    •  
    • static int total_marine_num;
  • [특성] static 을 초기화해줄때는 보통 클래스 밖에서 초기화를 시켜준다 .
  • [특성] 어떤 클래스의 static 멤버 변수의 경우, 멤버 변수들 처럼, 객체가 소멸될 때 소멸되는 것이 아닌, 프로그램이 종료될 때 소멸 
    • class Marine {
        static int total_marine_num;
      
        int hp;                // 마린 체력
        int coord_x, coord_y;  // 마린 위치
        bool is_dead;
      
        const int default_damage;  // 기본 공격력
      
       public:
        Marine();              // 기본 생성자
        Marine(int x, int y);  // x, y 좌표에 마린 생성
        Marine(int x, int y, int default_damage);
      
        int attack();                       // 데미지를 리턴한다.
        void be_attacked(int damage_earn);  // 입는 데미지
        void move(int x, int y);            // 새로운 위치
      
        void show_status();  // 상태를 보여준다.
      
        ~Marine() { total_marine_num--; }
      };
      int Marine::total_marine_num = 0;
  • [특성]static은 변수뿐만 함수로도 쓰일수있다. 클래스 전체에서 딱 1개 존재하는 함수. 어떤 객체에 종속되는 것이 아니라 클래스에 종속되는 것으로, 따라서 이를 호출하는 방법도 (객체).(멤버 함수) 가 아니라,와 같이 (클래스)::(static 함수) 형식으로 호출
  • Marine::show_total_marine();

this

  • [정의] this  객체 자신을 가리키는 포인터의 역할을 합니다. 즉, 이 멤버 함수를 호출하는 객체 자신을 가리킴.
  • 모든 멤버 함수 내에서는 this 키워드가 정의되어 있으며 클래스 안에서 정의된 함수 중에서 this 키워드가 없는 함수는 (당연하게도) static 함수 뿐
Marine& Marine::be_attacked(int damage_earn) {
  this->hp -= damage_earn;
  if (this->hp <= 0) this->is_dead = true;

  return *this;
}
  • be_attacked 함수는 Marine& 타입을 리턴하게 되는데, 위 경우, *this 를 리턴. *this 는 그 객체 자신을 의미

const 함수

  • [정의]C++ 에서는 변수들의 값을 바꾸지 않고 읽기 만 하는, 마치 상수 같은 멤버 함수를 상수 함수 로써 선언할 수 있음
int attack() const;  // 데미지를 리턴한다.
  • 일단 상수 함수는 위와 같은 형태로 선언
(기존의 함수의 정의) const;
  • 그리고 함수의 정의 역시 const 키워드를 꼭 넣어주어야 함
int Marine::attack() const { return default_damage; }
  • 상수 함수로 이 함수를 정의함으로써, 이 함수는 다른 변수의 값을 바꾸지 않는 함수**라고 다른 프로그래머에게 명시 시킬 수 있음. 상수 함수 내에서는 객체들의 '읽기' 만이 수행되며, 상수 함수 내에서 호출 할 수 있는 함수로는 다른 상수 함수 밖에 없음. => 보통 getvalue() 함수들처럼 값을 읽기만할때만 사용
  •  
class MyClass {
public:
    int getValue() const; // 객체를 수정하지 않고 값을 읽음
    void setValue(int value); // 객체의 값을 수정함
private:
    int value_;
};

완벽히 소화시키기 어렵지만 꾸준히 익숙해지기

 

댓글