LHS와 RHS
LHS는 left-hand-side 표현입니다.
RHS는 right-hand-side 표현입니다.
예를 들어 x = 10이라고 할 때
LHS : x
RHS : 10
이렇게 됩니다.
C++ 메모리 모델안 basic
각각의 변수는 주소를 가집니다.
&x (only in RHS) : 변수 x의 주소를 리턴합니다.
&x : 0
&y : 4
x (in RHS) : 변수의 주소안 값을 할당합니다.
x는 16을 리턴합니다.
y는 99를 리턴합니다.
x (in LHS) : RHS 값을 변수의 주소에 저장합니다.
"x = 7" x주소 0에 7이 저장됩니다.
"y = 88" y주소 4에 88이 저장됩니다.
위를 표시하면 다음 아래와 같이 됩니다.
포인터 (Pointers)
포인터 값은 주소를 가리킵니다.
*x (in RHS) : 변수 x의 값이 가리키는 주소에 할당된 값을 리턴합니다.
예를 들어보겠습니다.
"x"는 16을 리턴합니다. "*x"는 7을 리턴합니다.
"y"는 99를 리턴합니다. "*y"는 81를 리턴합니다.
*x (int LHS) : 변수 x의 값이 가리키는 주소에 RHS 값을 저장합니다.
예를 들어보겠습니다.
"*x = 7" 16장소에 7을 저장합니다.
"y = 88" 99주소에 88을 저장합니다.
const 기초
const의 경우 메모리 주소를 얼린다고 생각하면 된다.
그렇기 때문에 변수에 const를 하면 그 변수의 값은 바꿀 수 없습니다.
이렇게 할경우 에러가 발생합니다.
const int x이기 때문에 x의 값을 변환할 수 없습니다.
포인터 const
변경가능한 포인터는 변경불가능한 위치를 가리킬 수 없습니다.
x가 const이므로 x의 주소를 가리킬 수 없습니다.
마찬가지로 변할 수 없는 포인터가 가리키는 값을 변경할 수 없습니다.
아래는 다른 변할 수 없는 포인터에 관한 예시입니다.
위의 경우 x는 const가 없으므로 마음대로 변환이 가능하지만
y의 경우 const int* y가 되어있으므로 *y = 10도 안되며 y = 10도 안됩니다.
아래는 또다른 경우입니다.
위의 코드에서 보면 int* const y를 진행하였습니다.
y의 주소에 const가 되어있기 때문에 포인터를 통해 y의 값은 바꿀 수 있습니다.
하지만 주소에 const이므로 주소값을 변경할 수는 없습니다.
다음은 클래스안에서의 const를 확인해 보겠습니다.
위의 경우
set_name을 보면 타입 string 타입 name이 const 되어있는 것을 확인할 수 있습니다.
즉 name의 형태는 변형이 불가능하므로 다음 식은 허용되지 않습니다.
hi()의 경우 const 함수로 선언되어 있습니다.
const 함수는 클래스의 상태를 변경하지 않습니다.
즉 const 함수 내에서 해당 클래스의 멤버 변수를 수정할 수 없습니다.
그런데
위 hi()의 경우 name_ = name_ + "hi"로 값을 수정하려 하므로 오류가 발생합니다.
'C++' 카테고리의 다른 글
[C++] 얕은 복사(Shallow copy) VS 깊은 복사(Deep copy) (0) | 2023.10.29 |
---|---|
[C++] call by value/ call by pointer/ call by reference (0) | 2023.10.28 |
[C++] 네임스페이스(Namespace)를 사용하는 이유 (0) | 2023.10.28 |
[C++] 클래스 안에서의 명명 규칙 (0) | 2023.10.27 |
[C++] 선언(Declaration) VS 정의(Definition)/헤더파일과 소스파일 분리 + 예시코드 (0) | 2023.10.26 |
댓글