본문 바로가기
C++

[C++] LHS변수와 RHS변수/const 활용(pointer const etc..)

by 유노brain 2023. 10. 28.
반응형

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를 하면 그 변수의 값은 바꿀 수 없습니다.

 

#include <iostream>

int main(){
    const int x = 10;
    int y=66;
    x = 20;
    y = 15;
}

이렇게 할경우 에러가 발생합니다.

const int x이기 때문에 x의 값을 변환할 수 없습니다.

 

포인터 const

변경가능한 포인터는 변경불가능한 위치를 가리킬 수 없습니다.

#include <iostream>

int main(){
    const int x = 10;
    int *y = &x; //not allowed since x is const
    *y = 10;
    return 1;
}

x가 const이므로 x의 주소를 가리킬 수 없습니다.

 

 

마찬가지로 변할 수 없는 포인터가 가리키는 값을 변경할 수 없습니다.

#include <iostream>

int main(){
    const int x = 10;
    const int *y = &x;
    *y = 10; //not allowed since *y is immutable
    return 1;
}

 

 

아래는 다른 변할 수 없는 포인터에 관한 예시입니다.

#include <iostream>
#include <iostream>
using namespace std;


int main(){
   int x = 10;
   const int* y = &x;  //okay
   x = 10; //okay
   *y = 10; // not allowed since *y is immutable

    cout<<y<<endl;
   return 1;
}

위의 경우 x는 const가 없으므로 마음대로 변환이 가능하지만

y의 경우 const int* y가 되어있으므로 *y = 10도 안되며 y = 10도 안됩니다.

 

 

아래는 또다른 경우입니다.

#include <iostream>
#include <iostream>
using namespace std;


int main(){
   int x = 10;
    int* const y = &x;  //okay
   x = 10; //okay
   *y = 10; // okay
   y = 20; // not allowed since y is immutable

    cout<<y<<endl;
   return 1;
}

위의 코드에서 보면 int* const y를 진행하였습니다.

y의 주소에 const가 되어있기 때문에 포인터를 통해 y의 값은 바꿀 수 있습니다.

하지만 주소에 const이므로 주소값을 변경할 수는 없습니다.

 

 

다음은 클래스안에서의 const를 확인해 보겠습니다.

#include <iostream>
#include <iostream>


class Car {
    public:
    Car(std::string name) :name_(name){}
    const std::string* name() {return name_;}
    void set_name(const std::string name){ name = name + "hi";} //not allowed since name is const
    void hi() const {name_ = name_ + "hi";} //not allowed since this points an immutable location

    private:
    std::string name_;
};

int main(){
    Car car1("hyundai");
    std::string* car_name = car1.name(); //not allowed since name() returns a const pointer
    return 11;
}

위의 경우 
set_name을 보면 타입 string 타입 name이 const 되어있는 것을 확인할 수 있습니다.

즉 name의 형태는 변형이 불가능하므로 다음 식은 허용되지 않습니다.

 

hi()의 경우 const 함수로 선언되어 있습니다.

const 함수는 클래스의 상태를 변경하지 않습니다.

즉 const 함수 내에서 해당 클래스의 멤버 변수를 수정할 수 없습니다.

그런데

위 hi()의 경우 name_ = name_ + "hi"로 값을 수정하려 하므로 오류가 발생합니다.

반응형

댓글