: ref vs const ref
-> 언제 사용?
: 한번 참조를 하게 된 후, 다른 객체를 참조하는 것이 아니다.
초기화 이후에는 다른 객체를 복사대입한다.
: 참조하는 객체를 지칭하는 또 다른 객체
: 상수포인터와 동일한 기능을 수행함.
-> 그렇다면, const ref와의 차이점이 무엇인가??
레퍼런스는 주소 연산자 이동을 못하고, 한 번 참조 후에는 다른 값을 참조하지 못한다.
const ref 는 가리키는 참조값을 수정을 못한다.
: 한번 설정된 객체를 그래도 따라감.
-> 이 코드를 통해서 일반 ref와 const ref 차이 알 수 있음.
결과
: 참조 객체는 초기화할 때의 객체를 그대로 따름, 이후의 대입에 관해서는 값대입만 하고, 그 객체를 따르지는 않음.
결과
참조 ref는 가리키는 객체의 값을 변경할 수 없음.
ref 의 경우,직접 ref에 접근해서 원본의 데이터를 변경할 수 있지만,
const ref 의 경우, 직접 const ref 객체에 접근해서 원본 데이터 변경 불가함.
: 기존 변수를 가리킴.
초기화
1) 포인터 변수는 변수의 주소로 초기화함.
: null값 넣을 수 있음.
-> 초기값 생략 가능함.
2) 참조 변수는 , 변수명으로 초기화함.
: null값을 넣을 수 없음.
-> 반드시 초기값 필요함.
주소
1) 포인터의 주소는 새로운 메모리 할당됨.
2) 참조의 주소는 참조 변수의 메모리
1) 포인터 참조
포인터로, 참조할 경우,
: ++연산자, -- 연산자 등을 통해
외부의 메모리에 접근하는 특징이 있고, 부주의할 경우 문제 유발함.
2) lvalue 참조.
참조는 외부메모리에 접근이 불가능함. -> 상수포인터와 동일한 동작 수행함.
: call by address, ref를 통해 , 위의 내용에 맞게
동작되는지 확인하라
1) call by ref
데이터 초기화와 변경 후, 결과 추출
++와 -- 연산을 한 후 , 출력
-> 참조한 변수의 value 자체가 변경됨.
2) call by address
-> 원본 -91의 값이 변동 없음.
--> call by ref와 동작이 다름을 확인할 수 있음.
=> 이때는 다른 포인터로 접근을 하게되는 것임.
++ 연산이후에 값을 대입해보자.
-> 할당되지 않은 힙메모리를 참조했기 때문에 발생할 것임.
함수안에서 포인터의 주소와 , ++연산한 데이터의 메모리 주소를
출력해보자.
-> 포인터연산 ++이 발생됨을 확인할 수 있음.
--> 포인터의 경우, 안전하지 못함.
레퍼런스로 변경해서 주소 확인해보자.
-> 포인터 연산이 이루어지지 않음을 확인함.
원본과 참조 변수의 주소를 출력하라.
-> 동일함을 확인할 수 있음.