728x90
SMALL
1. const 변수
const int n = 0; int const n = 0; n = 2; // Compile Error
위의 두 코드는 의미가 같다.
2. const 멤버 변수
클래스 내부에도 const키워드를 사용해서 초기화를 할 수 있는데 반드시 초기화 리스트를 사용해야만 한다.
class Example
{
const int n;
Example(void) : n(1){}//
const int num = 1;
};
class ERROR
{
const int N;
Bar(void)
{
N = 1; // Compile Error
}
};
위 와 같이 클래스에서 멤버변수를 const로 만들고 초기화 하고 싶다면 반드시 생성자 초기화 리스트를 써야하고 아래 클래스를 돌려보면 컴파일 에러가 발생하는 것을 알 수가 있다.
C++11부터는 const int n = 1;
로도 가능합니다.
Const 와 함께 사용하는 포인터
아마 대부분의 사람들이 헷갈려하는 부분이고 저도 가끔씩 헷갈려서 확실하게 정리하려고 이 부분을 작성합니다.
크게 두가지로 나눌 수 있습니다.
1. const int* ptr
이렇게 포인터를 선언하면 포인터를 이용해서 포인터가 가리키는 곳에 접근해서 변경할 수 없다.
int num = 0;
const int* ptr = #
// *ptr is const *ptr = 1;
// Compile Error
num = 1; // OK not mean make const int num;
주의 할 점은 const 포인터로 주소값을 지정한다고 해서 그 이전의 값을 바꿀 수 없는 건 아니다.
2. int* const ptr
이렇게 포인터를 선언하면 포인터가 한번 가리킨 녀석을 변경할 수가 없다.
실제 C++의 레퍼런스(참조자)를 이런식으로 구현한다.
int num1 = 1;
int num2 = 2;
int* const ptr = &num1; //가능
ptr = &num2; // Compile Error
레퍼런스(참조자)const
만약 const 레퍼런스를 사용하고 싶다는 건 const형 변수를 참조 즉 상수를 참조하고 싶을 때 입니다.
const int num = 10; // 상수
int& ref1 = num; // Compile Error: 비-상수 참조자로 상수 참조 불가
const int& ref2 = num; // OK
이렇게 상수가 아닌녀석도 const참조자로 사용할 수 있습니다.
int x = 5; const int& ref1 = x;
과연 이것은 의미가 있을까
std::string& const firstname;
어차피 레퍼런스는 변경할 수 없기 때문에 const를 하던 안 하던 전혀 차이가 없다는게 제 결론입니다.
이렇게 g++을 사용했을때 어차피 의미 없다고 잘 알려주는군요.
3. 함수뒤에 오는 const
class HumanA {
public:
HumanA(std::string name, Weapon& weapon);
void attack() const;
private:
std::string _name;
Weapon& _weapon;
};
함수 뒤에 오는 const의 의미는 오로지 클래스에서만 가능한데, 이 함수 안에서는 어떤 변수도 바꿀 수 없음(mutable은 예외)를 뜻한다.
const가 붙은 함수 내에서는 const가 붙은 다른 함수를 제외한 일반 함수는 호출하지 못한다.
728x90
BIG
'CPP' 카테고리의 다른 글
[Cpp 개념공부]__cin에서 endof 를 쏴줄 때 cin이 다시 사용하지 못하는 이슈__ (4) | 2023.01.13 |
---|---|
[Cpp 개념공부]cin대신 getline (2) | 2023.01.13 |
배열 활용 함수(C++)(알고리즘) (0) | 2022.12.29 |
priority queue(우선순위 큐)(C++)(알고리즘) (2) | 2022.12.29 |
queue와 dqueue(C++)(알고리즘) (0) | 2022.12.29 |