Skip to main content

[C++] 상수



상수 #

  • 상수(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

  • 2진수, 8진수, 16진수로 숫자 표기하기
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를 사용하자.
#define PI 3.141592

constexprconst #

  • 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 #



Pero
Author
Pero
Keep moving forward.

comments powered by Disqus