@ 16. 1 ~ 17. 1/C++

참조형 관련

namoeye 2014. 6. 30. 22:36

참조형은 대부분

함수 / 메서드의 파라미터 이다

이유는?

값에 의한 전달이 아닌 원본 자체가 넘겨지는 참조에 의한 전달을 할 수 있기 때문에..

아래와 같은 함수가 있다면

void swap(int &first, int &second)

함수는 아래처럼 사용한다.

int x=5, int y=6;

swap(x,y)

보통의 참조형 변수를 상숫값으로부터 초기화할 수 없듯이 참조형 파라미터의도 상숫값을 인자로 못받음.

아래는 안됨

swap(5,6);

 

만약 포인터로부터의 참조라면..

함수의 인자로 사용할 변수가 포인터이고 위의 swap함수를 사용한다면.

int x=5, int y=6;

int *xp=&x, int *yp=&y;

swap(*xp, *yp); 이렇게 하면 된다.

 

그리고 되도록이면 파라미터를 참조형으로 하되 const를 이용하여 원본이 실수로 방지되는 것도..

void swap(const int &first...)이렇게..

 

그리고 참조형 리턴 타입이 있는데..int& swap(const int &first...) 이런식

리턴값에 참조형을 이용하는 가장 큰 목적은 효율성이다.

전체 객체를 리턴하는 대신 그 객체의 참조만 리턴하면 불필요한 복제 오버헤드를 피할 수 있다.

당연하지만 참조형 리턴 타입은 리턴되는 객체가 함수/메서드의 종료 이후에도 계속 유효할 때만 사용 할 수 있다.

* 단 절대로 로컬변수를 리턴해서는 안된다. 함수가 구동되는 동안만 스택에 저장되어 있다가 함수가 리턴할 때 스택과 함꼐 사라진다.!

 

 

 


참조형 타입이 할 수 있는 일은 거의 모두 포인터로 가능하다.

위의 swap함수는 포인터로 해보면

void swap(int *fist, int *second)

그래도 참조를 사용하는 이유는 포인터보다 더 안전하니까..

유요하지 않은 데이터를 ㄷ가리키는 것이 거의 불가능 하다.

참조대신 포인터를 사용하는 유일한 상황은 가리키는 대상을 바꾸려고 할때...

리턴값에 있어 참조와 포인터 중 어느것을 이용해야하는가..? 이것은..

해당 메모리를 누가 소유하고 있는지..

즉 만약 변수를 넘겨받는 측이 그 객체와 관련된 메모리의 해제를 책임져야 한다면 리턴 타입으로 포인터..

반대로 삭제나 해제해서는 안되면 참조..

 

 


//C와 포인터 스타일
void separate1(const int arr[], int size, int **odds, int *numodds, int **evens, int *numevens)
{
 *numodds=*numevens=0;
 for(int i=0;i<size;i++)
 {
  if(arr[i]%2==1)
  {
   (*numodds)++;
  }
  else
  {
   (*numevens)++;
  }
 }

 *odds=new int [*numodds];
 *evens=new int[*numevens];

 int oddsPos=0, evensPos=0;
 for(int i=0;i<size;i++)
 {
  if(arr[i]%2==1)
  {
   (*odds)[oddsPos++]=arr[i];
  }
  else
  {
   (*evens)[evensPos++]=arr[i];
  }
 }
}

//C++과 참조형 + 포인터 스타일
void separate2(const int arr[], int size, int *&odds, int &numodds, int *&evens, int &numevens)
{
 numodds=numevens=0;

 for(int i=0;i<size,i++)
 {
  if(arr[i]%2==1)
  {
   numodds++;
  }
  else
  {
   numevens++;
  }
 }

 odds=new int[numodds];
 evens=new int[numevens];

 int oddsPos=0, evensPos=0;
 for(int i=0;i<size;i++)
 {
  if(arr[i]%2==1)
  {
   odds[oddsPos++]=arr[i];
  }
  else
  {
   evens[evensPos++]=arr[i];
  }
 }
}