0315 형변환 , L/Rvalue

2025. 3. 15. 17:50개발자 능력치 물약/C++

템플릿은 인스턴스화 전까지 컴파일시 아무런 코드로 변환되지 않는다

static 멤버 변수: 프로그램이 종료될때 사라짐, 모든객체들이 공유하는 변수

const static 이 아니면 외부에서 선언, 선언시 0으로 초기화

static으로 선언한 함수: 클래스::함수명 으로 호출, 함수내에서는 static으로 선언한 변수만 사용가능 

초기화 리스트 : 생성자() : 변수(값), ... { }


mutable : const 함수 안에서 변수를 수정하기 위해 씀
explicit: 명시적 형변환, 컴파일러가 마음대로 형변환해서 오류가 생기는걸 방지하기 위해 씀

c++에는 static_cast, dynamic_cast 같은 발전된 형변환 기능이 있다. 

static cast는 컴파일 타임에 형변환 오류를 잡아줌

dynamic_cast는 상속관계에서 클래스의 포인터나 레퍼런스를 안전하게 변환하기 위해 사용한다.

 

Lvalue 와 Rvalue

// 좌측값들
//
int i = 42;
i = 43;            // ok, i 는 좌측값
int* p = &i;       //&i 를 쓸 수 있다.
int& foo();        // int& 을 리턴하는 함수
foo() = 42;        // ok, foo() 는 좌측값
int* p1 = &foo();  // ok, &foo() 를 할 수 있다.

// 우측값들
//
int foobar();  // int 를 리턴하는 함수
int j = 0;
j = foobar();         // ok. foobar() 는 우측값이다
int* p2 = &foobar();  // error. 우측값의 주소는 참조할 수 없다.
j = 42;               // 42 는 우측값이다.

 

Lvalue는 메모리상에 주소를 가지는 식(expression)   

Rvalue는 주소를 가지지않는 임시 객체 (리터럴, 연산결과, 변수..)

 

C++에서 함수호출식의 R/Lvalue 여부는 반환타입에 결정된다. 

int& foo()는 int 레퍼런스 타입을 반환하므로 

foo()를 Lvalue로 사용할 수 있다. { foo()가 x라는 변수를 리턴하는 기능을 가진 함수면 &x 를 반환하므로}

 

함수가 참조자를 반환하여 Lvalue를 돌려주는 능력은 연산자 오버로딩에서도 볼 수 있다.

 

 연산자 오버로딩

std::map::operator[] 연산자

맵 요소에대한 레퍼런스를 반환하므로

mymap[key] =value; 처럼 대입연산자로 값을 할당하는 것이 가능하다.

 

int foobar(); 는 왜 Rvalue일까

함수가 반환하는 값은 임시로 생성된 복사본 또는 임시 객체이다.

특정 메모리 주소를 갖는 이름있는 객체가 아니기 때문이다.

다시 말해, 참조를 통한 별칭이 아니라 새로운 값을 복사(혹은 move)해서 돌려주므로

이 함수 호출 결과는 일종의 임시(Rvalue) 객체로 간주됨

 

int* p2 = &foobar(); 가 안되는 이유도 

foobar()는 임시객체이므로 특정 메모리 주소를 가지고 있지 않아서 참조가 불가능하다.

 

이런 임시객체 관련된 문제를 해결하기 위해 Rvalue참조 (&&)라는 개념이나

  std::move라는 야무진 연산이 등장했다.

https://modoocode.com/141

 

씹어먹는 C++ - <2. C++ 참조자(레퍼런스)의 도입>

모두의 코드 씹어먹는 C++ - <2. C++ 참조자(레퍼런스)의 도입> 작성일 : 2012-01-01 이 글은 133772 번 읽혔습니다. 안녕하세요 여러분! 오랜만에 찾아온 Psi 입니다. 사실 이전 강좌에서 부터 강조해왔지

modoocode.com

https://modoocode.com/189

 

씹어먹는 C++ 토막글 ① - Rvalue(우측값) 레퍼런스에 관해

함수의 오버로딩에서 void foo(X& x); 는 좌측값 참조 오버로딩, void foo(X&& x); 은 우측값 참조 오버로딩 여러분은 이를 통해 foo 가 좌측값에, 혹은 우측값에 호출됨에 따라서 상황을 적절하게 처리할

modoocode.com

https://modoocode.com/197