call by reference : 참조에 의한 호출
: 메모리 주솟값을 넘기는 방식
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
call by reference variable : 참조자를 이용한 참조에 의한 호출
int a=1;
int b=2;
swap(a,b)
void swap(int &a, int &b){
int temp=a;
a=b;
b=temp;
}
이렇게 하면 call by reference와 같이 a와 b의 값이 실제로 바뀐다.
C++에서 함수 외부에서 선언된 변수에 접근하는 두 가지 방식
- 주솟값을 이용한 Call-by-reference
- 참조자를 이용한 Call-by-reference
#include <iostream>
void swap(int& a, int &b);
int main(void){
int a = 1;
int b = 2;
std::cout << a << " " << b << std::endl;
swap(a, b);
std::cout << a << " " << b;
return 0;
}
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
참조자 :
참조자(Reference) :
변수는 할당된 메모리 공간에 붙여진 이름이다.
참조자는 할당도니 메모리 공간에 붙여진 다른 이름이다.즉 별명이다.
참조자는
int b=2;
int &a=b; 이렇게 쓴다.
NULL로 초기화 할 수 없다.
무조건 r-value가 있어야 한다.
int& A = *pa; 이렇게 해도 된다. r-value에 이미 선언된 변수의 이름이나 *pa같은 게 오면 된다.
int& b; <-이건 안된다. 오류가 난다. 무조건 r-value가 있어야 한다.
#include <iostream>
void swap(int& a, int &b);
int main(void){
int a = 1;
int* pa = &a;
int& A = *pa;
std::cout << "A :: " << A;
//int& b; //<-이건 컴파일 에러
return 0;
}
참조자는 변수에 대해서 보다 함수에서 활용하는데 써먹는다.
->참조자로 call by reference를 할 수 있다.
#include <iostream>
void swap(int& a, int &b);
int main(void){
int num01 = 1;
int num02 = 2;
std::cout << "num01 : " << num01 << " num01 : " << num01 << std::endl;
swap(num01, num02);
std::cout << "num01 : " << num01 << " num02 : " << num02 << std::endl;
return 0;
}
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
이거는
swap함수가 실행되면
int &a=num01;
int &b=num02;
이것과 같다. 그래서 원래 변수에 저 별명이 붙고 그걸 이용하는 것과 같다. 함수 외부의 변수와 연결고리가 된다.
call-by-value에서는 변수에 들어있던 값만 빼서 전달한다. 그런데 참조자에 의한 call by reference는 외부 함수도 다른 함수의 안에서 할당된 메모리 공간의 이름을 부를 수 있게 되기 때문에 메모리에 접근이 가능하다.
'c++' 카테고리의 다른 글
23. [C++] friend 클래스 , friend 멤버 함수 (0) | 2023.01.21 |
---|---|
22. [C++] friend (0) | 2023.01.20 |
20. [C++] 객체 배열 (0) | 2023.01.20 |
19. [C++] 생성자와 소멸자 (0) | 2023.01.20 |
11. [C++] 동적 메모리 할당과 해제, 변수 동적 할당, 동적 배열 / 2차원 배열 동적 할당 (0) | 2023.01.15 |