(C++) 4장 참조자,한정자, 포인터와 자료형간의 변환

1. 참조자와 한정자
자료형의 별칭은 using, typedef
변수의 별칭을 만든는 것은 참조자와 포인터
예)
using salary=double;
salary peter=100.12;
salary &sangwon=peter;
--->>sangwon 변수는 salary형으로 선언한 peter를 참조하게 되며 peter변수의 별칭이 된다.
참고로 cout을 이용해 변수를 그대로 출력하면 값이 출력되고 주소연산자(&) 변수명 앞에 붙여서 (&변수명) 출력하면 해당 변수의 메모리 주소가 출력된다.

예)
#include<iostream>
using namespace std;
int main()
{
 using salary=double;
 salary peter=100.12;
 salary &sangwon=peter;  반드시 초기화를 해줘야한다.
 cout<<"peter`s memory address="<<&peter<<endl;
 cout<<"sangwon`s memory address="<<&sangwon<<endl;
return 0;
}
결과: 주소값이 같다.

(다른 예제)

#include<iostream>
using namespace std;
int main()
{
 int val1=100;
 int &val2=val1;
 int &val3=200;  //에러 발생 참조자는 변수의 별칭이어야 한다.
 int &val4=val2;
 int &val5; //초기화 하지 않아 오류 발생.
 return 0;
}
---------------------------------------------------------------------------------
참조자 선언과 사용

 참조자 선언에 대해 살펴보자.
 참조자를 선언하고 정의한 부분을 살펴보면 익숙한 연산자 &가 등장한다. & 연산자는 포인터(pointer)를 공부한 사람이면 누구나 알고 있을 것이다. & 연산자는 변수의 주소값을 반환한다. 변수의 주소값을 반환하려면 할당된 메모리 공간이 이미 있어야 한다. 하지만 ref라는 변수를 대상으로 & 연산자를 사용하였다는 점에 주목하자. ref는 메모리 공간에 무엇도 할당되지 않은 상태인데 어떻게 ref를 대상으로 주소값 반환을 할 수 있겠는가? 상식적으로 맞지 않다. 그렇다면 여기서 &는 무엇을 의미하는가? 바로 참조자를 의미한다. 새로 선언되는 변수의 이름 앞에 등장하는 & 연산자는 참조자를 의미한다. 정리하면 다음과 같다. 이미 선언된 변수의 앞에 등장하는 & 연산자가 오면 주소값을 반환하라는 명령이고, 새로 선언된 변수의 앞에 등장하는 & 연산자는 참조자 선언을 의미한다. 이를 코드로 살펴보자.
 num은 이미 선언된 변수이다. 이 때 & 연산자는 주소값을 반환하는 연산자이고, 포인터 변수 ptr은 그 주소값을 저장한다. 반면에 ref는 새로 선언된 변수이고, 이 때 & 연산자는 참조자를 의미하는 선언이다. num이라는 변수가 할당된 메모리 공간을 가리키는 또 다른 이름, 즉 또 다른 변수가 된다. 이 정도면 참조자 선언에 대한 이해는 충분할 것으로 생각한다.
 위 코드의 실행결과는 어떻게 될까? 메모리 어느 공간에 10이 할당되어 있고, num1 변수로 가리키고 있다. num1 변수가 가리키는 공간에 대해 num2라는 참조자를 선언했다. 즉 num1과 num2가 동일한 메모리 공간을 가리키고 있다. num2에 20을 저장하면 num1, num2가 가리키는 동일한 메모리 공간이 10으로 변경된다. 결국 num1, num2가 가리키는 메모리 공간에 저장된 값이 같고, 결국 num1, num2에 저장된 주소값 또한 동일하다.
 참조자는 이미 선언된 변수를 대상으로 사용할 수 있다고 하였다. 위 코드에서 ref1은 변수가 아닌 상수를 대상으로 참조자를 선언했기 때문에 에러이다. ref2는 참조하는 대상이 없기 때문에 에러이다. ref3는 NULL값을 참조하기 때문에 에러이다.
---------------------------------------------------------------------------------------------

*********lvalue 참조자, rvalue참조자
지금까지 설명한 참조자는 lvalue 참조자 이다. C+11부터는 rvalue참조자가 등장한다.
lvalue는 주소를 가르키는 변수, rvalue는 수식의 값 자체를 의미한다.
대표적인 예는 숫자와 문자 문자열이다. 1,2,'a',"hello"등은 rvalue이다.

그렇다면 i++와 ++i는 어떻게 될 까? 결론적으로 ++i는 lvalue이고 i++는 rvalue이다.
++i는 i값을 증가시킨 다음 i를 반환하지만 i++은 i값을 증가시키지만 i값이 아닌 증가하기전의 값을 임시로 보관하여 반환하기 때문이다.

정리하면 lvalue는 수식이 끝나도 존재하며, rvalue는 수식이 끝나면 사라지는 임시적인 값이다.  하지만 C+11부터 rvalue참조자를 사용하면 ,수식이 종료되어도 생명주기(lifecycle)를
연장해 값을 참조 할 수 있다.
rvalue참조자를 선언 할 때는 &가 아닌 &&를 사용한다.
int &&rval=42;





















참고사이트: http://bunhere.tistory.com/409
출처: 모던 C++프로그래밍 (프리렉 출판사)

댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기