[C++] 초기화 리스트(Initializer list), static

2022. 2. 9. 17:24Languages/C++

*<씹어먹는 C++>을 보며 공부하여 정리한 글입니다.

 

 

 

오늘도 열심히 우리의 이해를 도와줄 몬스터(Monster) 클래스!

#include <iostream>
#include <string>

class Monster {
private:
	std::string name;
	int health;
	int damage;
    
    static int totalMonsterNum;

public:
	Monster() = default;
	Monster(std::string name, int health, int damage);
};

 

 

초기화 리스트를 사용하지 않은 일반적인 생성자

Monster::Monster(std::string name, int health, int damage) {
	this->name = name;
	this->health = health;
	this->damage = damage;
}

 

  • 생성자는 객체 생성을 먼저 한 후, 그 다음에 대입 연산을 수행
  • 객체 생성 후에 대입이 이루어지기 때문에 초기화 리스트보다 속도가 느리다.
  • 참조(Reference)상수생성과 동시에 초기화를 해주어야 하기 때문에 위와 같은 방법은 오류가 날 수 있다.
  • 그렇기에 클래스 내부에서 참조나 상수를 넣고 싶다면, 초기화 리스트를 통해 생성자를 만들어줘야 한다.

 

초기화 리스트를 사용한 생성자

Monster::Monster(std::string name, int health, int damage) : 
	name(name), health(health), damage(damage) {}

 

  • 생성과 동시에 초기화를 진행하기에 속도가 더 빠르다.
  • 생성자 함수 내부는 비어있고, 멤버 변수를 지칭해서 괄호 안의 변수나 데이터로 초기화해주는 것이 특징
  • 멤버 변수매개변수이름이 같아도 된다. (외부에 있는 변수는 "멤버 변수"를, 괄호 안의 변수는 "매개변수"를 우선적으로 지칭하도록 되어 있기 때문. 따라서, this 키워드가 필요 없다.)

 

 


클래스 Static 멤버 변수 및 함수

 

  • 객체가 소멸될 때 사라지는 것이 아니라, 프로그램이 종료될 때 소멸한다.
  • Static 멤버 변수는 클래스의 모든 객체들이 공유하는 한 개의 변수다.
  • Static 멤버 변수 및 함수에 대한 접근은 클래스에 범위지정 연산자(::)를 사용한다.
  • 다음과 같이 Static 멤버 변수초기화한다.
class Monster {
    static int totalMonsterNum;      // 자동으로 0이 할당된다.
    ...
};

int Monster::totalMonsterNum = 10;   // static 멤버 변수 초기화

 

  • 클래스 내부에서 Static 멤버 변수를 초기화하려면 const static 변수일 때만 가능하다.
class Monster {
    const static int totalMonsterNum = 10;
    ...
};

 

  • Static 멤버 함수는 특정 객체에 종속되는 것이 아닌, 클래스 전체에 존재하는 한 개의 함수다.
  • Static 함수 내에서는 static 변수만 사용이 가능하다. (어떤 객체의 소유 변수인지 확인이 불가능하기 때문)
  • Static 함수 내에서 새로운 일반 변수나 객체를 생성해서 리턴하는 것은 가능하다. 
class Monster {
private:
	int hp;
	static int damage;
public:
	static void Show();
};

void Monster::Show() {
	std::cout << "Static 함수 호출" << std::endl;
	// hp = 10;  일반 변수 사용 불가
	damage = 10;
}

int main() {

	Monster::Show();   // 객체 생성없이 클래스에 바로 접근하여 호출
	return 0;
}

 

 

728x90
반응형