ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 참조형 관련
    @ 16. 1 ~ 17. 1/C++ 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];
      }
     }
    }

     

Designed by Tistory.