씹어먹는 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();
}