2009. 11. 18. 08:09

int x = 20;

int& fx()
{
    return x; 
}

void main()
{
    fx() = 30;       // 함수 호출을 L-Value에 놓을 수 있다.
    cout << x << endl;   // 함수가 리턴될 때 객체가 생성되지 않게 한다.
}

// 레퍼런스를 리턴하는 경우는 다음과 같다.
// 1. 함수의 호출에 어떤 값을 대입할 때, 주로 연산자 재정의에서[] 연산자를 재정의 할 때 사용된다.
// 2. 객체를 리턴 할 때 리턴값으로 새로운 객체가 생성되지 않도록 한다.
//    주로 연산자 재정의에서 = 연산자와, << 연산자를 재정의 할 때 사용된다.


// 지역 변수의 참조를 리턴하는 것은 절대 피해야 한다.

 int& foo()
{
    int n =10;
    return n;  //Warning 
}
void main()
{
    int& k = foo();
    k = 20; 
}

// 어떤 함수가 레퍼런스를 파라미터로 갖을때 상수값을 직접 전달하는 것은 불가능하다.

 void foo(int a)

}

void goo(int& a)
{
}

void hoo(const int& a)
{
}

void main()
{
    int n = 10;
    foo(n); 
    foo(10);
 
    goo(n);
    goo(10);
 
    hoo(n);
    hoo(10);
}



// Pointer VS Reference
// 포인터와 레퍼런스는 다른 객체를 가르키게 할 수 있다는 점에서 매우 비슷하다.
// 하지만 아래와 같은 몇가지 차이점이 있다.
// 1. Null Pointer는 만들 수 있지만 Null Reference는 만들 수 없다.
int* p1 = 0;  // OK
int* p2;   // OK
int& r;    // Error

int* p = 0;
int& r = *p; // 어떻게 될까요?

// 1. Null Pointer는 만들 수 있지만 Null Reference는 만들 수 없다.

int* p1 = 0;  // OK
int* p2;   // OK
int& r;    // Error
int* p = 0;
int& r = *p; // 어떻게 될까요?


// 2. Pointer는 반드시 사용전에 유효한 객체를 가르키는지 확인(Null Test) 해야 하지만 Reference는
//    확인할 필요가 없다.
void foo(const int* p)
{
     if(p) // Null test 
     cout << *p;
}
void foo(const int& r)
{
    cout << r;

 
}


//3. Pointer는 중간에 다른 책체를 가르킬 수 있지만 레퍼런스는 자신이 참조하는 객체를 바꿀 수 없다.
int a = 10, b = 20;
int* p = &a;
p = &b; OK
int a = 10, b = 20;
int& r = a;
r = b;  // r이 참조하는 곳 즉, a에 20을 넣는다.

'Programming > C++' 카테고리의 다른 글

Namespace  (0) 2010.07.12
* Inline Function  (0) 2009.11.20
* Overloading 된 함수 찾는 순서  (0) 2009.11.19
* Function Overloding  (0) 2009.11.19
* Default Parameter  (0) 2009.11.19
Posted by 어북어위크