이 부분에 대해 공부한 후 포스팅을 해보려고 한다.
- Reference
C++에서는 Reference(&)라는 변수타입이 제공된다.
간단히 말해서 별명을 붙혀주는 기능이다.
int &ret = dp[curr];
| cs |
ret = 30;
printf("dp[curr] : %d\n",dp[curr]); // 30
| cs |
- Reference type
이러한 Reference는 세 가지 종류의 참조형을 제공한다.
- non-const value
- const value
- r-value (using &&)
int a = 10;
int& ref1 = a; // okay [non-const l-value]
const int b = 20;
int& ref2_1 = b; // not okay
const int& ref2_2 = b; // okay [const l-value]
int&& ref3 = 30; // okay [r-value]
| cs |
l-value, r-value에 대해서는 다음 포스팅에서 다뤄보도록 하겠다.
- Pass by reference
reference를 함수 인자부분에 사용하는 것을 말한다.
인자 변수가 복사되어 생성되지 않기 때문에 Pass by value에 비해 속도가 빠르다.
int Square(const int& input) {
int ret = input * input;
return ret;
}
| cs |
- Return by Reference
이 부분은 조심해서 사용해야 한다.
reference를 함수 반환값으로 사용하는 것을 말한다.
이 기능을 수행할 때는 reference의 원본이 메모리 상에 유지되어야 한다.
(당연한 말이지만 무심코 이 원칙을 지키지 않을 수 있다.)
#include <bits/stdc++.h>
using namespace std;
int& function() {
int val = 10;
return val;
}
int& function2() {
int val2 = 20;
return val2;
}
int main(){
int& ref = function();
int& ref2 = function2();
cout << ref << endl; // output : 20
}
| cs |
function2() 함수가 호출되면 ref, ref2변수 모두 val2의 주소값을 가지게된다.
위의 과정은 심각한 오류를 초래할 수 있으므로 사용하지 말도록 하자.
아니면 static 변수로 선언하여 이 문제를 해결할 수 있다.
static 변수는 global 변수와 같이 data영역에 할당이 되고
함수, 함수의 지역변수는 heap영역에 메모리 할당과 해제가 이루어 진다.
static 변수는 선언과 동시에 data영역에 존재해 함수 호출 후에도 남아있게 되기때문에
위의 문제를 해결할 수 있다.
#include <bits/stdc++.h>
using namespace std;
int& function() {
static int val = 10;
return val;
}
int& function2() {
static int val2 = 20;
return val2;
}
int main(){
int& ref = function();
int& ref2 = function2();
cout << ref << endl; // output : 10
}
| cs |
[출처]
https://boycoding.tistory.com/207 /
https://snbosoft.tistory.com/entry/%EC%A0%9C2%EC%9E%A5-C-%EA%B8%B0%EB%B3%B8-Reference%EB%A5%BC-return%ED%95%98%EB%8A%94-%ED%95%A8%EC%88%98%EC%9D%98-%EC%A0%95%EC%9D%98 /
https://www.tutorialspoint.com/cplusplus/returning_values_by_reference.htm /