hyunjin

[C++] <2. C++ 레퍼런스> 함수인자,상수,배열,리턴 레퍼런스 본문

개인 공부/C++

[C++] <2. C++ 레퍼런스> 함수인자,상수,배열,리턴 레퍼런스

_h.j 2021. 3. 2. 19:01
728x90

씹어먹는 C++ <2. C++ 레퍼런스>

 

 

레퍼런스(참조자)

#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