개인 공부/C++
[C++] <2. C++ 레퍼런스> 함수인자,상수,배열,리턴 레퍼런스
_h.j
2021. 3. 2. 19:01
728x90
레퍼런스(참조자)
#include <iostream>
using namespace std;
int main() {
int a=10;
int b=3;
int& another_a = a; //a의 참조자
another_a = 5;
cout << "a : " << a << endl;
cout << "another_a : " << another_a << endl;
another_a = b;// a = b
return 0;
}
또 다른 이름이라고 컴파일어에게 알려주는 것
another_a에 하는 작업은 사실 a에 그 작업을 하는 것과 마찬가지
- 레퍼런스는 선언 시 반드시 누구의 별명이 될 것인지 지정해야함
- 레퍼헌스는 어떤 변수의 참조자가 되면 더 이상 다른 변수 참조 불가
another_a = b;// a = b;
&another_a = b // &a = b;
another_a가 b를 가리키는 것이 아님.
함수 인자 레퍼런스
void change_val(int &p) {
p = 3;//number = 3과 같은 의미
}
int main() {
int number = 5;
cout << number << endl; // 5
change_val(number);
cout << number << endl; // 3
return 0;
}
호출되는 순간 int &p = number 실행됨.
상수에 대한 참조자
int &ref = 4;// error
const int &ref = 4;
int a = ref; // a = 4;
상수 값 자체가 리터럴이기 때문에.
상수 참조자로 선언한다면 리터럴 참조도 가능.
레퍼런스 배열
int a ,b;
int &arr[2] ={ a,b }; // 불가
레퍼런스 배열, 레퍼런스의 레퍼런스, 레퍼런스의 포인터는 존재할 수 없음.
주소값이 존재한다라는 것은 해당 원소가 메모리 상에 존재한다는 의미다.
하지만 리터럴(고정된 값)는 특별한 경우 아니면 메모리 상에 공간 차지 하지 않음.
이렇게는 가능
int arr[3] = {1,2,3};
int (&ref)[3] = arr; // 가능
반드시 크기 명시해 줘야함.
레퍼런스 리턴하는 함수
레퍼런스 리턴하는 함수에서 지역 변수의 레퍼런스 리턴하지 않도록 조심.
함수에서 값 리턴( int f( ) ) | 함수에서 참조자 리턴( int& f( ) ) | |
값 타입으로 받음( int a = f( ) ) | 값 복사됨 | 값 복사됨. 다만 지역 변수의 레퍼런스 리턴하지 않도록 주의 |
참조자 타입으로 받음( int& a = f( ) ) | 컴파일 오류 | 가능. 다만 지역 변수의 레퍼런스를 리턴하지 않도록 주의 |
상수 참조자 타입으로 받음( const int& a = f( ) ) | 가능 | 가능. 다만 지역 변수의 레퍼런스를 리턴하지 않도록 주의 |
참조자로 리턴 받게 되면 불필요한 복사를 생략할 수 있어 더 빠름.
함수의 매개 변수로 참조자를 받을 때
매개 변수로 전달할 변수의 주소값이 새 메모리 공간(스택)에 저장되고 포인터 처럼 그 메모리 공간 레퍼런스가 사용하는 형태
함수의 매개변수로 참조자를 받을 때 주소를 전달하기 위해 메모리가 사용됨.
728x90