본문 바로가기

C++

c++] 레퍼런스와 연산자 오버로딩(1)

(1) Reference

                               

a라는 이름의 공간에 10을 저장하겠다!. 그런데 a의 공간을 다르게 부를 수 있는 방법이 없을까?

int &b = a를 통해 a가 가리키는 공간을 b라고도 불러보자!


배열은 어떻게 접근할까?

그렇다면, int *a = new int[5]일때(int a[5]은 reference로 참조 할 수 없다), a의 reference인 b를 호출하고자 할 때, 어떻게 선언해야 하는가?

int* &b = a가 된다. 이는 포인터의 reference 의미로 a를 b라고도 부르겠다는 것은 변함이 없다.


함수의 arg에서는 어떻게 쓰이나?

함수의 인자로 배열에 대한 정보를 넘길 때는 call-by-value 값으로 보내는 경우는 대부분 없다. 메모리 복사가 일어나기 때문이다.

이를 대체하고자 일반적으로 배열의 주소나 그 reference를 함수의 인자로 넘겨준다. 


포인터 접근

void display(const int *a,int a_size)

{

for(int i = 0; i < a_size; i++)

cout << a[i] <<"\n"


ref 접근

void display(int* &ref,int a_size)

{

for(int i = 0; i < a_size; i++)

cout << a[i] <<"\n"

}


struct or class을 활용

struct node{

int node_number;

node* next

node(int your_number) : node_number(your_number), next(NULL){}

}

node *root = new node(3)

...

...

...

위와 같은 struct가 있고 리스트로 연결되어 있다고 하고 탐색하는 함수 display가 있다고 하자

void display(node* &a)

{

if( a == NULL)

return;

while(a->next != NULL){

cout << a->number << "\t

a = a->next

}

}

display(root);


그러나 위와 같이 사용할 수 있으나 굳이 reference를 붙여가면서 쓸 필요는 없다.


함수 반환형이 reference??

int& simple_a(int &a)

{

a++;

return a;

}

입력으로 변수를 reference로 받아서 그 값을 1 증가시키고 reference를 반환하는 함수 simple_a가 있다!! 이 함수는 어떤 변수의 이름을 a라 부르고 "a의 값을 1증가 시키고 a가 가리키는 공간의 명칭을 반환하자~~!" 라는 의미이다. 주의 할 것은 다음 두 가지 케이스!!


int b = 0;

int &c = simple_a(b);

int d = simple_a(b);


c += 100;


cout << "c의 값: " << c <<endl;

cout << "d의 값: " << d << endl;


결과:

c는 변수 b가 가리키는 공간을 'c라고도 부르겠다~~' 라는 의미이고

d는 변수 b가 가리키는 공간을 '내 공간(d)에 복사하겠다!' 라는 뜻이 된다.






출처: https://stackoverflow.com/questions/14047191/overloading-operators-in-typedef-structs-c

  https://edykim.com/ko/post/c-operator-overloading-guidelines/