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. 매개변수 자료형에 사용되는 경우
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가지 장점 !!
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 객체 이동 std::move (0) | 2022.11.03 |
---|---|
C++ 해시(Hash)의 의미 그리고 구현 (0) | 2022.10.31 |
C++ 난수 생성 std::random + 생성 시간 측정하는 std::chrono 라이브러리 (0) | 2022.10.24 |
C 난수 생성 (0) | 2022.10.24 |
C++ 데이터 타입(data type) (0) | 2022.10.23 |