생성자의 초기화 리스트
생성자의 초기화 리스트란 : 생성자 호출과 동시에 멤버 변수들을 초기화해준다.
생성자 초기화 리스
Marine::Marine() : hp(50), coord_x(0), \
coord_y(0), damage(5), is_dead(false) {} //두개는 같은 의미의 코드이다.
Marine::Marine()
{ hp = 50; coord_x = coord_y = 0; damage = 5; is_dead = false; }
멤버 초기화 리스트
흥미로운점은 원래 생성자에서 멤버 변수와 같은 매개변수를 사용하면 안되는데, 생성자 초기화 리스트에서는 그게 가능하다.
Marine::Marine(int coord_x, int coord_y) : coord_x(coord_x), coord_y(coord_y), hp(50),
damage(5), is_dead(false) {} //이름이 같아도 정상적으로 작동한다.
Marine::Marine(int coord_x, int coord_y)
{ coord_x = coord_x; coord_y = coord_y; hp = 50; damage = 5; is_dead = false; }
//이건 정상작동하지 않는다.
초기화 리스트를 사용하는 이유
- 생성과 초기화를 동시에 하기 위해서생성과 동시에 초기화 시켜주어야 하는 것 들 중 대표적으로
상수와 레퍼런스가 존재한다.
다만 c++11부터는 상수필드를 다음과 같이 초기화 해줘도 된다.
class Test { const int standard = 10; public: Test(int s = 10) {} }
- 클래스 내부에 레퍼런스 변수나 상수를 넣고 싶다면 이들을 생성자에서 무조건 초기화 리스트를 사용해서 초기화 시켜주어야만 한다.
- 조금 더 하는 작업이 적어서 효율적이다.
int a = 10; // 생성자의 초기화리스트를 사용하는 것과 같다 int a; a = 10; // 생성자의 초기화리스트를 안 사용한 것 같은 느낌
static 변수
- 전역 변수 같지만 클래스 하나에만 종속되는 변수를 의미한다.
- static 멤버변수의 경우 멤버변수 처럼 객체가 소멸될때 소멸되는 것이 아닌, 프로그램이 종료될 때 소멸된다.
- static 멤버변수의 경우 클래스의 모든 객체들이 ‘공유’하는 변수이다. - 각 객체별로 따로 존재하는 멤버변수들과 달리 static 변수는 하나만 가지게 된다.
- 원래 모든 전역변수와 static 변수는 초기화하지 않아도 0으로 됐으나 클래스 static변수는 초기화 해줘야 한다.
클래스 내부에서 선언 후 밖에서 초기화를 한번 해줘야만 한다.
class Marine { static int total_marine_num; public: }; int Marine::total_marine_num = 0;
class Marine { static int total_marine_num = 0; //이건 불가능하다.
상수 (const static)의 경우는 클래스 내부 초기화가 가능하다.
class Marine { const static int x = 0;
static 함수
- 객체에 종속되지 않고 클래스 전체에 단 하나만 존재하는 함수
class Marine { public: static void show_total_marine(); };
void Marine::show_total_marine()
{
//반드시 static변수 사용.
std::cout << "전체 마린 수 : " << total_marine_num << std::endl;
}
- 호출하는 방법 : (객체).(멤버 함수) 가 아닌 (클래스)::(static 함수) 로 호출
- 예시 :
Marine::show_total_marine();
static
함수 내에서는 클래스의static
변수 만을 이용할 수 밖에 없다.
this
- this는 객체 자신을 가리키는 포인터이다.
- 실제 모든 멤버 함수 내에는 this 키워드가 정의되어 있다.
- 정의가 새로 이뤄지는게 아니라 실제로 class가 작동하려면 자기 자신을 가리키는 객체가 필요하기 때문에 그것을 this키워드로 표현한 것 뿐이다.
Marine& Marine::be_attacked(int damage_earn)
{
hp -= damage_earn;
if (hp <= 0) is_dead = true;
return *this;
}
Marine& Marine::be_attacked(int damage_earn)
{
//사실 모든 녀석들인 이게 생략이 된 것이다.
this->hp -= damage_earn;
if (this->hp <= 0)
this->is_dead = true;
return *this;
}
- 클래스 안에서 정의된 함수 중에서 this 키워드가 없는 함수는 static 함수 뿐이다.
레퍼런스를 리턴하는 함수
- int &c = a.레퍼런스 리턴함수(); ⇒ 치환을 한다고 보면된다. (즉 레퍼런스를 이용해서 멤버변수에 쉽게 접근할 수 있다.)
- int A = a.레퍼런스 리턴함수() ⇒ 그냥 값이 복사되고 독립적인 변수 a가 된다.
- int & c = a.임시변수 리턴함수() ⇒ 오류가 발생한다레퍼런스가 아닌 값을 리턴하는 경우 임시객체를 가지게 되는데 임시객체는 레퍼런스를 가질 수 없기 때문이다.
- return *this는 레퍼런스를 리턴하는 것이다.
a.access_x() = 3;
과a.x = 3;
는 동일한 문장이 된다.
- '레퍼런스를 리턴하는 함수는 그 함수 부분을 리턴하는 원래 변수로 치환해도 된다.
const 함수
상수 멤버함수 예시
class Marine { public: int attack() const; }; int Marine::attack() const { return default_damage; }
Uploaded by
N2T728x90
'CPP' 카테고리의 다른 글
[c++개념공부]참조자와 이름공간 (0) | 2023.01.27 |
---|---|
[c++개념공부]동적할당과 class (0) | 2023.01.27 |
[c++개념공부]참조자 (2) | 2023.01.27 |
[CPP함수 사용법]setfill 함수와 setw함수 사용법 (0) | 2023.01.15 |
[CPP 모듈 고민]SEARCH에서 출력 순서 (0) | 2023.01.15 |