7.24(화) C++기초문법 - reference

from Study/C++ 2007/07/24 17:14 view 20207

4교시

//
레퍼런스문법총정리

// 1. 개념: 기존메모리에대한별명.

int main()

{

        int  n = 10;

        int* p = &n;

        int& r = n;            //

 

        r = 20;

 

        cout << n << endl;     // 20

 

        int& r2;               // ? Error. 반드시초기화되어야한다.

        //----------------------------------------------------

        int*& rp = p;  // ok. 포인터의별명

        int&* pr = r;  // 별명의주소?  error

}


 

// 2. 원리: 내부적으로대부분의컴파일러는포인터를사용한다.

//         "자동으로역참조되는포인터" 라고도부른다.

void inc1( int x )     { ++x; }

void inc2( int* p )    { ++(*p); }

void inc3( int& r ) { ++r; }

 

void main()

{

        int a = 10;

        int b = 10;

        int c = 10;

 

        inc1( a );             // 실패- call by value

        inc2( &b );            // ok. call by pointer

        inc3( c );             // ok. call by reference int &r = c;

 

        cout << a << endl;     // 10

        cout << b << endl;     // 11

        cout << c << endl;     // 11

}


 

// 3. 함수호출과레퍼런스

 

// 인자값을변경하는함수-> 포인터가좀더좋다. ( 명확하다. )

// 인자값이바뀌지않은함수

// 1) bulit in type => const T&가오히려나쁘다.(4byte사용, 레지스터사용못함.)
//                     call by value
를사용.

// 2) user type     => const T&


struct AAA

{

        int data[10000000];   // 1M라고가정.

};

 

void foo( const AAA& a )   // call by value :  값을 변경하지 않을것 이다.

{                          // 단점: 메모리 사용량이 2개가 된다.

        a = 20;            // const& : 메모리 사용량을 줄이고 값을 변경하지 않게 한다.

}

 

void main()

{

        AAA x = 10;

 

        foo ( x );

       

        cout << x << endl;

}


 

Tag |

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다