const int a = 10; // a는 절대 값이 변하지 않음
void foo(const int x); // x는 함수에서 변경 불가
const int* p; // *p 값 변경 불가, p는 변경 가능
int* const p; // p는 변경 불가, *p 값 변경 가능
const int& ref = a; // ref를 통해 a 변경 불가
(기존의 함수 정의) const; 형식으로 선언class A {
int c;
public:
int get_c() const; // 선언
};
int A::get_c() const {return c;} // 정의
멤버 변수의 값을 바꾸지 않는 함수라고 명시
함수 내에서는 객체들의 '읽기' 만이 수행 (쓰기 하려하면 컴파일 에러)
함수 내에서 호출 할 수 있는 함수도 다른 상수 함수만 가능
const 객체로 매개변수를 받았을 시, 이 객체는 이 상수함수만 사용이 가능함.
그래서 사용하는 것
class Vector2D
{
double x, y;
public:
// 1. 일반 함수: 내부 멤버를 바꿀 가능성이 있다고 간주됨
void setX(double newX) { x = newX; }
// 2. const 함수: "멤버 변수를 절대 건드리지 않음"을 선언함
void print() const
{
std::cout << x << ", " << y << std::endl;
}
};
void func(const Vector2D& v) // const 객체로 받았으니 상수함수만 사용 가능
{
v.print(); // OK! (v를 수정하지 않는 상수 함수이므로)
v.setX(10.0); // Error! (수정하려 함)
}
수명(라이프타임)과 접근 범위(스코프) 또는 공유성을 지정하는 키워드
특징
함수 내 static 변수
함수가 여러 번 호출되어도 초기화는 한 번만 되고, 함수 종료되어도 남아 있음.
함수 호출되어 생성하는데 오래 걸리는 아주 큰 객체에 static 사용도 좋음
클래스 static 멤버
클래스의 모든 객체가 공유하는 변수/함수, 객체 없이도 사용 가능
전역/파일 static 변수
선언된 파일 내에서만 접근 가능(링크 범위 제한)
void foo() {
static int count = 0; // 함수 호출 횟수 누적
count++;
}
class MyClass {
static int shared; // 모든 객체가 공유
static void func() { ... } // 객체 없이 호출 가능
};
int MyClass::shared = 0; // 클래스 외부에서 반드시 정의
int main() {
MyClass::func(); // 객체 없이 호출
}
class MyClass {
static const int MAX = 100; // 모든 객체가 공유, 값은 불변
};