TIL/TIS 211123, 211124

gyeon·2021년 11월 22일
0

TIL/TIS

목록 보기
8/14

TIS

C++ 참조자

참조자의 기본 선언

기존에 할당된 메모리 공간에 다른 이름(별명)을 붙이는 것. 이때, 기존에 할당된에 주의.
레퍼런스할수 있는 변수는 상수가 아닌 변수들이다. -> 비const 참조에 대한 초기 값은 lvalue여야 합니다.C/C++(461)

int& ref2 = 4;
// 비const 참조에 대한 초기 값은 lvalue여야 합니다.C/C++(461)

한번 ref로 초기화 되면, 바꿀수 없다.

int main() {
    int a = 3;
    int b = 4;
    int& ref1 = a;
    ref1 = b;	// 참조한 값이 바뀌는지 테스트.
    //&ref1 = &b; 
    // 식이 수정할 수 있는 lvalue여야 합니다.
    printf("ref1\t: %d [%p]\n", ref1, &ref1);
    printf("a\t: %d [%p]\n", a, &a);
    printf("b\t: %d [%p]\n", b, &b);
    ref1 = 7;
    printf("ref1\t: %d [%p]\n", ref1, &ref1);
    printf("a\t: %d [%p]\n", a, &a);
    printf("b\t: %d [%p]\n", b, &b);
}

ref1 : 4 [0061FEC8]
a : 4 [0061FEC8]
b : 4 [0061FEC4]
ref1 : 7 [0061FEC8]
a : 7 [0061FEC8]
b : 4 [0061FEC4]
=> ref1은 초기화 할 때 이미 a를 참조하게 고정이 되어버렸다. 또한 ref1과 a는 값은 주소이므로 이름만 다르지 결국 같은 저장공간이다(=별도의 저장공간이 생기지 않는다).

함수에서의 참조

매개변수로서의 참조

void ref_func1(int &ref1) {
    ref1 = 3;
}

int main() {
    int a = 42;
    printf("a\t: %d [%p]\n", a, &a);
    ref_func1(a);
    printf("a\t: %d [%p]\n", a, &a);

반환형으로서의 참조와 댕글러 레퍼런스
함수의 반환형으로서도 참조값을 줄수 있다.
하지만, 함수의 지역변수를 반환하게 되면 반환값이 함수가 종료되면 사라지게 되어 댕글러 레퍼런스 문제가 발생하게 된다.
-> 매개변수로 전달받은 외부의 값을 넘겨주거나, 내부에서 동적할당을 하여 전달

이외의 규칙들

There shall be no references to references, no arrays of references, and no pointers to references
레퍼런스의 레퍼런스,레퍼런스의 배열, 레퍼런스의 포인터는 존재할 수 없다.

배열의 경우, 다음 자료형을 찾아갈때 주소를 기반으로 자료형의 크기만큼 오프셋 시킨다. 하지만 각 레퍼런스는 연속되지 않은 저장공간의 별칭과 같으므로, 레퍼런스들을 배열로 만들순 없다.
하지만 배열의 레퍼런스는 다음과 같이 선언한다.

profile
백엔드와 서버 in 42Seoul

0개의 댓글