-
참조형 관련@ 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];
}
}
}'@ 16. 1 ~ 17. 1 > C++' 카테고리의 다른 글
추상 팩토리 패턴...(개인적정리 ebook 참고) (0) 2014.09.01 srand() .. (0) 2014.07.05 메서드 오버라이딩(virtual)의 특수한 경우들 (1) 2014.06.28 업 캐스팅 슬라이싱.. (0) 2014.06.28 포인터 상속 virtual 객체 자꾸 까먹네. (0) 2014.06.26