4. 참조자는 Null이 될 수 없다.
무조건 메모리에 공간이 할당된 객체를 참조해야함.
-> 선언과 함께 초기화를 해주어야 한다.
그렇지 않다면 포인터를 사용해야한다.
5. Null 참조자?
int * pInt = 0;
int& rInt = *pInt;
미정의 동작 발생
-> 보통 프로그램 종료
6. 참조자의 장점
무조건 유효한 객체를 가리키고 있다는 불변속성을 가진다.
-> 인자 유효성 검사를 할 필요가 없음.
7. 예시
Bool SingByRandom( Player& player )
{
auto songs = player.GetSongList();
// bulabula
// ...
}
bool SingByRandom( Player* player )
{
if ( player == nullptr )
{
return false;
}
auto songs = player.GetSongList();
// bulabula
// ...
}
8. 포인터의 장점
1. 주소값을 바꾸어 다른 객체들을 참조할 수 있다.
-> 참조자는 변경 불가능
2. 무효한 상태(null)로 존재할 수 있다.
-> 참조자는 무조건 유효해야 함
9. 참조자를 써야만 하는 상황
Operator[] 연산자를 오버로딩한 경우
멤버변수 값을 변경할 수는 있게 해야겠고 ( 참조자냐 포인터냐 )
배열 쓸 때처럼 바로 접근은 하게 하고싶고 ( 참조 연산자 없어도 되는 참조자로 해야겠다.)
- 참조자 반환
Vector<int> v(10);
v[0] = 50
- 포인터 반환 가정
Vector<int> v(10);
*v[0] = 50;;
10. 정리
참조자
- 참조할 객체가 이미 존재할 때
- 다른 객체를 참조할 일이 결코 없을 때
- 포인터를 쓰면 문법이 어색해지는 연산자를 오버로딩 할 때
이외의 상황은 포인터를 사용
참조 용도라고 다 같은게 절대 아님. 구분해서 안쓰면 욕먹음