프로그래밍 언어/C++

C++ 변수와 함수에서의 const

ShovelingLife 2022. 10. 28. 17:00

Const 의미

컴파일러 상수(*상수 : 정적인 data. 초기화를 한번밖에 못하는 data. 메모리 변경이 불가하다). 변수를 상수화하여, 한번 할당된 상수로 할당된 메모리의 모든 비트를 변경하지 못한다.

Const의 장점

  • const키워드가 붙은 객체는 외부 변경을 불가능하게 한다.
  • class 바깥에서는 전역 / namespace 유효범위의 상수를 정의하는데 씀.
  • static 선언한 객체에도 const를 붙이는 것이 가능하다.
  • 정적 / 비정적 data 멤버 모두를 상수로 선언할 수 있다. 

변수에서의 Const 

int a = 10;

 

int const *pn

const int* pn = &n; -> 포인터가 가리키는 대상(값)이 상수. 

pn(주소)은 변경 가능하다, *pn(값)은 변경이 불가하다.

 

int *const pn = &n; -> 포인터 자체(주소)가 상수이다. 

pn(주소)은 변경 불가능하다. *pn(값)은 변경이 가능하다  

+ const int* const pn = &n; //  포인터와 값 둘다 상수 

pn , *pn 둘다 변경 불가

함수에서의 Const 

함수에서 Const가 사용되는 경우 

  1. 매개변수 자료형에
  2. 함수선언에  
  3. 리턴 자료형에

1. 매개변수 자료형에 사용되는 경우

PrintAddress(int &IParam), add(const int a, const int b) 

같은경우 함수의 파라미터를 함수 내에서 변경하면 안되므로 오류를 막기위해 사용한다. 

즉, 함수내에서 파라미터를 읽기만 하고 변경을 하는일이 없다는 것이다. 

 In Parameter 주소/ 포인터는 Const를 사용하면 아예 컴파일이 안되므로 빠르게 오류를 잡을 수 있다. 

2. 함수 선언에 사용하는 Const 

class P

{

int x, y; 

void print() const {...} ; -> Const 멤버함수 ! 이 함수 내에서 멤버변수 x, y의 변경이 불가하다. 

}

 

보통 Print함수는 Const 함수로 만들어져야 한다. 내부에서 변경되면 안되기때문에.. 

  • Const객체들은 const 멤버함수만 호출할 수 있다. 
  • Const 멤버함수와 비 const멤버함수는 중복될 수 있다.
  • this 포인터가 const 클래스형으로 바뀌므로 일반 함수 호출 불가.
  • 클래스 멤버 함수 변경 불가.

3. 리턴 자료형에서 사용하는 const

const int& GetX() { return x; }

이 경우 p1.GetX() = 10; 이런것이 불가. 

단시 주소가 필요해서 리턴을 한 경우 const를 붙여 안전하게 리턴받자. 

 

  [ + 함수 인자 전달시에는 꼭 const& 로 전달하자. ]

객체 를 파라미터로 그냥 전달하는것과 무슨차이가 있을까?

 

> 객체를 파라미터로 사용하는 경우 ( pass by-value )

  : 값에 의한 전달방식은 인자를 원본사용이 아닌 복사하여 사용하므로 임시 복사본이 생성되며 함수 소멸시 사라진다. ->이 때 당연히 복사생성자가 호출된다. 복사본이 생기므로 2개의 변수가 존재하는것.

 

> 참조(&)를 파라미터로 사용하는 경우 ( pass by reference )

 : 실제 data 원본을가지고 사용하므로 복사 생성자 호출하는 비용이 없다. 

  하지만 data 원본이므로 함수 내에서 값이 변경되는 risk가 생길 수 있으므로 경우에 따라 사용하여야 한다. 

  이 경우 한 개의 변수가 존재하며 2개의 이름을 가지게 된다. (함수인자명, 원본명)

 

> Const 참조(&)를 파라미터로 사용하는 경우 ( pass by reference to const )

: const 사용으로 실수로 함수 안에서 값이 변경되는것을 막을 수 있다. 

  실제 data원본이므로 복사 생성자가 호출되지도 않는다.    => 2가지 장점 !! 

 

출처 : [ Const 1편 ] 변수와 함수에서의 Const (tistory.com)