본문 바로가기
Study/C++

Call - by - Reference....

by 뿡뿡대마왕 2011. 9. 28.
반응형
자...이번에는 Call by Reference를  포인터가 아닌 &연산자를 이용해서 하는 방법을 보자구..저번에 알아본 &연산자에
대한것을 알고 있다고 가정하고..

c에서는 인자로 들어온 매개변수 값을 포인터로 넘겨서 직접 인자로 넣어준 메모리 접근하여 그 값을 변경했었는데
c++에서는 &연산자를 이용해서 좀 안전하게 인자로 들어온 값을 변경 할 수가있다.

예를 들어 c에서는 아래와 같이 포인터를 이용해 직접 메모리에 접근하여 그 값을 변경하였었다.

void Test(int * a, int *b)
{
int t;
            t= *a;
            *a = *b;
           *b = t;
}

int main()
{
     int aa=10, bb=20;
     Test(&aa, &bb); //인자로 들어간 aa와 bb값이 변경된다.
}


하지만 c++에서는
& 연산자를 사용해 다음과 같이 사용하더라~~

void Test(int& a, int& b)
{
        int t;
        t= a;
        a = b;
        b = t;
}
int main()
{
     int aa=10, bb=20;
     Test(aa,bb); //인자로 들어간 aa와 bb값이 변경된다.
}

우선 c 스타일 처럼 포인터를 이용해서 하면 직접적으로 메모리에 접근이 가능하다는 장점이 있는 반면 실수 하면 메모리에
직접적으로 건들이므로 위험성이 좀 크다는 것이고..

c++처럼 &연산자를 사용해서 하면 이름만 가지고도 인자로 들어온 값을 변경이 가능하다는 것이다...근데 이건 쓰는 사람 맘이긴한데...자기가 잘 코딩하면 구지 저렇게 쓸필요는 없을거 같다..
그냥 자기입맛대로~~^^

내가 맘에 드는 부분은 아래와 같다...
이 & 연산자를 이용해서 쓰면 아래와 같은 경우는 유용하게 쓸거 같다.~~

typedef struct _Test  // 모 이런 구조체가 있다고 하고.
{
   int a;
   char pp[10];
   int cc;
} Test;

void show(Test c) // 인자로 들어온 값을 단지 뿌려주기만 하는 함수..
{
    cout<<"a: " << c.a<<endl
    cout<<"pp: " << c.pp<<endl
    cout<<"cc: " << c.cc<<endl
}

int main(void)
{
   Test kkk;
   kkk.a =10;
   kkk.pp = "ddd";
   kkk.cc =100;
   show(kkk);
   return 0;

}
자 위와 같이 되어있다고 보자....그럼
show함수를 호출하면
Test c= kkk;

요렇게 되고 그다음에 구조체 c에서 값을 뽑아 출력할거다..
근데 이렇게 되면 저 구조체가 작으면 별 상관없겠지만 그래도 저 구조체 크기가..흠..대략 18바이트 이상이라고 보면
18바이트 메모리를 Test c에 복사해서 넣기 때문에 18바이트의 메모리를 복사하는 불필요한 과정이 생격나는 것이다. 맞나?;;
단지 인자로 들어올 부분을 출력만 할건데.. 구지 복사해가면서 메모리나 속도를 낭비를 할 필요는 없을거다...
따라서 show함수 부분을
void show(Test& c)요렇게 선언한다면
인자로 들어온 kkk에 c라는 이름을 하나 더 붙여 출력하기 때문에 복사 과정없이 좀더 빨리 쓸수 있는거 같당..

하지만 저런 과정에서 단지 출력만을 위한것인데 실수로 인자로 들어온 값을 변경 할 수 있으므로..출력만 할 경우에는
상수화시켜 버리면 안전하게 출력할수 있다.
void show(const Test& c) 요렇게....
후후후....

자 그럼 이것은 여기까지~~~
                                                                                                                                 <과묵,겸손,솔직,성실....


반응형

댓글