본문 바로가기

STUDY/C++

[ Const 1편 ] 변수와 함수에서의 Const

 - 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멤버함수는 중복될 수 있다.




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가지 장점 !! 



'STUDY > C++' 카테고리의 다른 글

new 와 new []의 차이점  (0) 2019.06.10
[ STL ] 표준 시퀀스 컨테이너(vector, deque, list)  (0) 2018.03.12
상속과 동적,정적바인딩  (0) 2018.02.28
Class내에서의 Static  (0) 2018.02.27
[ Const 2편 ] Class에서의 Const초기화  (0) 2018.02.27