hgk0404
hgk0404.tistory
hgk0404

공지사항

전체 방문자
오늘
어제
  • 전체 카테고리
    • [컴퓨터비전]
    • [Computer Science]
      • [컴퓨터네트워크]
      • [알고리즘]
      • [자료구조 in C]
      • [C & C++]
      • [이산수학]
      • [Math]
    • [머신러닝]
      • [Numpy, Pandas]
    • [Cloud]
      • [AWS]
      • [NCP]
      • [Kubernetes]
      • [Terraform]
    • [Dev]
      • [가상환경]
      • [Linux]
      • [Docker]
    • [Python]
    • [Coding Test]
      • [백준]
      • [프로그래머스]
      • [SQL]
    • [WEB]
    • [자격증, 일상]
    • [엑셀]
    • [금융]

인기 글

최근 글

최근 댓글

250x250
hELLO · Designed By 정상우.
hgk0404

hgk0404.tistory

[Computer Science]/[C & C++]

[C/C++] const의 위치에 따른 의미 정리

2022. 4. 20. 14:39
728x90

const란?

값을 변경하지 못하도록 상수화 시키는 명령어입니다.

 

C++에서 const명령의 위치에 따른 의미를 정리하겠습니다.

 

1. 변수 앞 const

 

const int num = 10;
// 변수 num을 상수화

 

2. *앞 const

 

const int *ptr = &value;
// 포인터가 가르치키는 값(실체)가 불변

const int *ptr = &value; 

이렇게 적용이 된다.

 

&value의 값이 불변이 되어버렸기 때문에 

 

-> *ptr = 10 ( X )

 

하지만 포인터 변수는 자유롭기 때문에 새로운 변수를 포인터에 연결하는 ptr = &value2는 가능하다.

 

 

3. *뒤 const 

 

int * const ptr = &value;
// 포인터 변수가 불변

int * const ptr = &value;

이렇게 적용이 된다.

 

*ptr = 10; 또는 *ptr = 40; 

-> 변수의 값(실체)은 자유롭기 때문에 포인터의 값을 변경하는 것은 가능.

 

하지만, ptr = %value2 ( X )

-> 포인터가 가리키는 위치를 변경하는 것은 불가능

 

3. *앞뒤 모두 const

 

const int * const ptr = &value;
// 실체와 변수 모두 불변

const int * const ptr = &vlaue; 

이렇게 적용이 된다. 

 

앞서 본 1, 2를 합친 개념입니다. 

 

4. 멤버 변수의 뒤에 오는 const

class SimpleClass {
private:
	int num;
public:
	void InitNum(int n) : num(n) { }
    
    int GetNum() { // const 선언이 추가되어야 에러 소멸
    	return num;
    }
    void ShowNum() const {
    	cout << GetNum() << endl; // 컴파일 에러 발생
    }
};

 

멤버 함수 뒤에 오는 const는 2가지 의미를 가진다.

  1. 이 멤버 함수에 있는 멤버 변수는 수정하지 않겠다(불변)
  2. 오직 읽기 전용(ReadOnly)으로만 호출하겠다.(쓰기는 하지 않겠다.)

 

5. 매개변수의 자리에 오는 const 

 

class EasyClass {
private:
	int num;
public:
	void InitNum(int n) : num(n) { }
    
    int GetNum() { // const 선언이 추가 되야함.
    	return Num;
    }
};

class LiveClass {
private:
	int num;
public:
	void InitNum(const EasyClass &easy) { // 참조자로 매개변수 객체 생성
		num = easy.GetNum();	// 에러 발생
    }
};

 

참조자로 받아오는 경우에도 4번의 2가지 법칙이 적용됩니다.

복사 오버헤드 없이 참조자로써 가져오지만 참조자 객체를 사용할 경우 읽기전용(ReadOnly)로만 사용하겠다는 의미.

 

 

 

 

728x90
저작자표시 동일조건 (새창열림)

'[Computer Science] > [C & C++]' 카테고리의 다른 글

2개 이상의 class 파일 분할  (0) 2022.03.24
C++ 파일 분할(visual studio)  (0) 2022.03.24
'[Computer Science]/[C & C++]' 카테고리의 다른 글
  • 2개 이상의 class 파일 분할
  • C++ 파일 분할(visual studio)
hgk0404
hgk0404
공부기록

티스토리툴바