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 |