CPP/Cpp module

[Cpp 개념공부] **Meaning of position of const(**const위치에 따른 의미차이)

뜨거운 개발자 2023. 1. 13. 01:43

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