씹어먹는 C++ 5일차
❗참고 : https://modoocode.com/253
static
- 클래스 내에 static 함수와 변수가 존재할 수 있음
static 변수
- 전역변수와 같으나 클래스 하나에만 종속되는 변수
- 어떤 class의 static 멤버 변수는, 객체가 소멸될 때 소멸하지 않고 프로그램이 종료될 때 소멸됨
- static 멤버 변수는 class의 모든 객체가 공유하여, 모든 객체들이 단 한 개의 static 멤버 변수를 사용함
#include <iostream>
class Test{
  static int s;
  int a;
  int b;
  const int c;
public:
  Test();
  Test(int a, int b);
  Test(int a, int b, int c);
  
  void show_values();
  ~Test() { s--; }
};
int Test::s= 0;
Test::Test()
  : a(10), b(20), c(30) {
    s++;
}
Test::Test(int a, int b)
  : a(a), b(b), c(30) {
    s++;
}
Test::Test(int a, int b, int c)
  : a(a), b(b), c(c) {
    s++;
}
void Test::show_values() {
  std::cout << a << " | " << b << " | " << c << std::endl;
  std::cout << "ststic value = " << s << std::endl;
}
int main() {
  Test t1;
  t1.show_values();
  Test t2(1, 5);
  t2.show_values();
  Test t3(100, 200, 300);
  t3.show_values();
  return 0;
}
-- 실행 결과 --
10 | 20 | 30
ststic value = 1
1 | 5 | 30
ststic value = 2
100 | 200 | 300
ststic value = 3
static 함수
- 특정 객체에 종속되지 않고 클래스 전체에 딱 1개만 정의
- 멤버 함수는 객체를 만들어 멤버 함수를 호출
(객체).(멤버 함수)
- static 함수는 객체가 없어도 클래스 자체에서 호출 가능
    - 어떤 객체도 static 함수를 소유하고 있지 않음
 
(클래스)::(static 함수)
this
- 객체 자신을 가리키는 포인터의 역할
- 모든 멤버 함수 내에서는 this 키워드가 정의 되어 있음
- 클래스 내에 정의된 함수 중 this 키워드가 없는 경우는 static 함수 뿐
static bool bigger_ten;
Test& Test::func_t(int a) {
  num = a;  // this->num = a;
  if (num > 10)  // if (this->num > 10)
    bigger_ten = true;
  else
    bigger_ten = false;
  
  return *this;
}
const
- 
    변수의 값을 바꾸지 않고 읽기만 하는 상수 같은 멤버 함수를 상수 함수로 선언 가능 
- 
    상수 함수를 정의하는 방법 
(기존의 함수의 정의) const;
const int default_number;
int Test::getNumber() const { return default_number; }
// getNumber 함수는 상수 멤버 함수로 정의됨
explicit
- implicit의 반대말, 명시적
- 위 키워드를 사용하여 생성자를 선언하면, 암시적 변환을 수해하지 않음
- 해당 생성자가 복사 생성자의 형태로도 호출되는 것을 막음
mutable
- 변경 가능한
#include <iostream>
class A {
  mutable int data_;
  int data2_;
 public:
  A(int data) : data_(data) {}
  void DoSomething(int x) const {
    data_ = x;
    // data_ 변수가 mutable로 선언되어 가능
    data2_; = x;
    // 에러 : const 함수 내에서 멤버 변수 값 변경 불가
  }
  void PrintData() const { std::cout << "data: " << data_ << std::endl; }
};
int main() {
  A a(10);
  a.DoSomething(3);
  a.PrintData();
}