상수 #
- 상수(Constant)란 변하지 않는 데이터이다.
- 리터럴 상수와 심볼릭 상수가 있다.
리터럴(Literal) 상수 #
return 5; // integer literal
bool myNameIsAlex { true }; // boolean literal
double d { 3.4 }; // double literal
std::cout << "Hello, world!"; // C-style string literal
리터럴 값 |
예시 |
기본 타입 |
boolean |
true , false |
bool |
integer |
5 , 0 , -3 |
int |
floating point |
1.2 , 0.0 , 3.4 |
double (float 이 아니다!!) |
character |
‘a’ , ‘\n’ |
char |
C-style string |
“Hello, world!” |
const char[14] |
- 접미사(suffix)를 붙여서 리터럴 상수의 타입을 바꿀 수 있다.
리터럴 값 |
접미사 |
결과 타입 |
integer |
u or U |
unsigned int |
integer |
l or L |
long |
integer |
ul , uL , Ul , UL , lu , lU , Lu , LU |
unsigned long |
integer |
ll or LL |
long long |
integer |
ull , uLL , Ull , ULL , llu , llU , LLu , LLU |
unsigned long long |
floating point |
f or F |
float |
floating point |
l or L |
long double |
- 부동 소수점 리터럴의 과학적 표기법(Scientific notation)
// 기본 표기법
double pi = 3.14159;
// 과학적 표기법
double avogadro = 6.02e23; // 6.02 x 10^23
double electron = 1.6e-19; // 1.6 x 10^-19
int decimal = 10; // 10진수
int octal = 012; // 8진수 -> 앞에 0을 붙인다.
int hexadecimal = 0xA // 16진수 -> 앞에 0x를 붙인다.
int binary = 0b1010; // 2진수 -> 앞에 0b를 붙인다.
10진수 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
… |
8진수 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
20 |
… |
16진수 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
10 |
… |
2진수 |
0 |
1 |
10 |
11 |
100 |
101 |
110 |
111 |
1000 |
1001 |
1010 |
1011 |
1100 |
1101 |
1110 |
1111 |
10000 |
… |
심볼릭(Symbolic) 상수 #
- 변수처럼 이름이 있는 상수이다.
- 선언과 동시에 반드시 초기화해야 한다.
#define
#
#define
매크로를 사용해서 상수를 정의한다.
- 전처리 단계에서 그대로 값으로 치환된다.
- 따라서 컴파일 에러라도 발생하면, 꽤나 헷갈릴 것이다. 왠만하면
const
를 사용하자.
constexpr
와 const
#
constexpr
은 반드시 컴파일타임에 값이 확정되어야 한다.
const
는 (컴파일타임이든 런타임이든) 한 번 값이 초기화되면 변할 수 없는 것이다.
- 선언과 동시에 초기화하거나,
- 멤버 초기화 리스트(Member initializer list)를 사용해서 초기화해줄 수 있다.
constexpr int MAX = 100; // 컴파일타임 상수
void Func(int n)
{
constexpr int constexpr_MAX = MAX + 3; // (O) 컴파일타임 상수
constexpr int constexpr_n = n + 3; // (X) 런타임 상수 불가
const int const_n = n + 3; // (O) 런타임 상수
const int const_NO_INIT; // (X) 초기화 해야 됨
const_n = 4; // (X) 값 수정 불가
}
포인터와 const
#
int one = 1;
int two = 2;
const int* p1 = &one; // 상수 데이터
*p1 = 2; // (X) 포인터를 이용해서 값 변경 불가
p1 = &two; // (O) 포인터가 가리키는 주소 변경 가능
int* const p2 = &one; // 상수 포인터
*p2 = 2; // (O) 포인터를 이용해서 값 변경 가능
p2 = &two; // (X) 포인터가 가리키는 주소 변경 불가
const int* const p3 = &one; // 상수 포인터, 상수 데이터
*p3 = 2; // (X) 포인터를 이용해서 값 변경 불가
p3 = &two; // (X) 포인터가 가리키는 주소 변경 불가
함수 매개변수와 const
#
void ChangeValue(const int val) // const 파라미터이므로
{
val = 2; // (X) 변경 불가
}
클래스 멤버 함수와 const
#
class MyClass
{
public:
int member;
void NonConstFunc()
{
member++;
}
void ConstFunc() const // const 멤버 함수라서
{
member++; // (X) 멤버 변수를 변경할 수 없다.
NonConstFunc(); // (X) const가 아닌 멤버 함수를 호출할 수 없다.
}
};
객체와 const
#
const MyClass myClass{}; // const 객체라서
myClass.member = 3; // (X) 멤버 변수를 변경할 수 없다.
myClass.NonConstFunc(); // (X) const가 아닌 멤버 함수를 호출할 수 없다.
myClass.ConstFunc(); // (O)
References #