- 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 |