본문 바로가기
[C++]

[C++] REFERENCE

by Hevton 2021. 6. 24.
반응형

레퍼런스 : 변수의 별명. 포인터와 비슷하게 보인다.

 

형식

자료타입& 변수이름 = 대상변수;

short s = 5;

// 레퍼런스
short& rs = s;
    
//포인터
short* ps = &s;
    
cout << s << endl;
cout << rs << endl;
cout << *ps << endl;

--------------------
OUTPUT

5
5
5

 

 

포인터와 레퍼런스는 내부적으로 비슷하게 동작하는데, 굳이 왜 포인터를 쓰냐? -> 차이점이 있다.

- 레퍼런스변수는 별도의 공간이 없다. 같은 메모리번지수를 사용한다. 별명일뿐

- 포인터는 별도의 공간을 할당을 받아서 가리키게 되는 것.

 

각 변수의 메모리 주소를 찍어보자.

cout << &s << endl;
cout << &rs << endl;
cout << &ps << endl;


--------------------

output

0x7ffeefbff41e
0x7ffeefbff41e
0x7ffeefbff408

 


레퍼런스의 방식.

int main() {

    int a = 1;
    int b = 2;
    
    // 레퍼런스는 선언과 동시에 초기화가 되어야한다. 단, 예외로 클래스의 멤버변수일 때에는 초기화리스트 이용해 초기화 가능하다.
    int& c = a;
    
    c = 3;
    
    c = b; // b의 별명으로 바뀌는게 아니라, b의 값이 들어가는것.
    /*
     레퍼런스는 한번 바인딩 되면 고정. int z = 10; int& x = y; 했으면, x = z 할 경우 y에 10이 들어가는것.
     포인터는 주소값을 계속 바꿀 수 있음. int z = 10; int* x = &y; 했다가 x = &z 해서 주소를 바꾸면서 포인팅을 바꿀 수 있듯.
     */
    
    c = 4;
    
    cout << c << endl;
    cout << a << endl;
}

 

const 키워드 붙일 시, 마찬가지로 해당 변수 수정 불가.

int main() {

    int a = 1;
    int b = 2;
    
    const int& c = a;
    
    c = 3; // 불가
}

a를 통해서는 바꿀 수 있음.

 

 

일반 레퍼런스 변수는, 상수 초기화를 할 수 없다. 기본적으로 변수의 별명이니까.

int main() {

    int a = 1;
    int b = 2;
    
    int& c = 3; // 불가
        
}

하지만 const를 붙여주면 가능하다는 예외가 있다.

const int& c = 3; // 가능

이렇게 const를 붙여주면 레퍼런스 변수도 상수를 참조하게 할 수 있다.

 

 

 

반응형

'[C++]' 카테고리의 다른 글

[C++] Lambda Expression  (0) 2021.06.24
[C++] 함수 포인터  (0) 2021.06.24
[C++] ENUMERATION  (0) 2021.06.24
[C++] 구조체 크기 관련  (0) 2021.06.23
[C++] 공용체. Union, 주의점!!  (0) 2021.06.22