CPP/씹어먹는 c++

[c++개념공부] 생성자 초기화리스트, static 변수 함수, 레퍼런스 리턴 함수, this

뜨거운 개발자 2023. 1. 27. 19:25

 


 
생성자의 초기화 리스트

생성자의 초기화 리스트란 : 생성자 호출과 동시에 멤버 변수들을 초기화해준다.

생성자 초기화 리스

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; }
//이건 정상작동하지 않는다.

 

초기화 리스트를 사용하는 이유

  1. 생성과 초기화를 동시에 하기 위해서생성과 동시에 초기화 시켜주어야 하는 것 들 중 대표적으로
    상수와 레퍼런스
    가 존재한다.
    • 다만 c++11부터는 상수필드를 다음과 같이 초기화 해줘도 된다.
      class Test {     const int standard = 10; public:     Test(int s = 10) {} }
  2. 클래스 내부에 레퍼런스 변수나 상수를 넣고 싶다면 이들을 생성자에서 무조건 초기화 리스트를 사용해서 초기화 시켜주어야만 한다.
  1. 조금 더 하는 작업이 적어서 효율적이다.
    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는 객체 자신을 가리키는 포인터이다.
  • 실제 모든 멤버 함수 내에는 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 함수 뿐이다.

 

레퍼런스를 리턴하는 함수

  1. int &c = a.레퍼런스 리턴함수(); ⇒ 치환을 한다고 보면된다. (즉 레퍼런스를 이용해서 멤버변수에 쉽게 접근할 수 있다.)
  1. int A = a.레퍼런스 리턴함수() ⇒ 그냥 값이 복사되고 독립적인 변수 a가 된다.
  1. int & c = a.임시변수 리턴함수() ⇒ 오류가 발생한다레퍼런스가 아닌 값을 리턴하는 경우 임시객체를 가지게 되는데 임시객체는 레퍼런스를 가질 수 없기 때문이다.
  1. return *this는 레퍼런스를 리턴하는 것이다.
  1. a.access_x() = 3;a.x = 3; 는 동일한 문장이 된다.
  1. '레퍼런스를 리턴하는 함수는 그 함수 부분을 리턴하는 원래 변수로 치환해도 된다.

 

const 함수

💡
C++ 에서는 변수들의 값을 바꾸지 않고 읽기 만 하는, 마치 상수 같은 멤버 함수를 상수 함수로써 선언할 수 있습니다.

상수 멤버함수 예시

 class Marine {  public:    int attack() const; }; int Marine::attack() const { return default_damage; }

 


Uploaded by

N2T
728x90