nakka soft world !

reference 본문

프로그래밍언어/C++

reference

nakka 2017. 3. 15. 10:14
728x90

reference


1. 기초

int main()

{

int n = 10; // 메모리 4바이트 메모리 할당

int* p = &n; 


int& r = n;  // 기존 메모리(변수)의 별칭을 부여 하는 것


cout << &n << endl;  // 10

cout << &r << endl;  // 10


r = 20;


cout << n << endl;  // 20

}


### reference_1.PNG


2. 레퍼런스 변수 주의 사항


int main()

{

int n1 = 0;

int& r1 = n1;


int& r2;   // error. 반드시 초기화해야 함.

}



3. call by reference


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

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

voif inc3(int& r) { ++r; }  // int& r = c;


int main()

{

int a=10, b=20, c=10;


inc1(a); // a는 증가 안함.

inc1(&b); // b는 증함.

inc1(c); // c는 증함.


cout << a << endl;

cout << b << endl;

cout << c << endl;

}


### reference_2.PNG



4. call by pointer

int main()

{

int n = 0;


scanf("%d", &n); // call by pointer

cin >> n; // call by reference

}



5. const reference

void foo(int x) // call by value : 원본인자를 변경하지 않겠다.

{

x = 20;

}


int main()

{

int a = 10;


// 함수 호출뒤에도 a의 값은 변경 되면 안된다.

foo(a);


cout << a << endl; //10

}

 -> 간단한 경우에는 괜찮다.


struct BigData {} ; // 크기가 매우 큰 구조체


//void foo(BigData x) // 복사본으로 인해 메모리 오버헤드 발생

void foo(const BigData& x) // 복사본을 만들지 않기 때문에 메모리 오버헤드 발생하지 않음. const로 인해 변경이 금지됨.

{

x = 20;

}


int main()

{

BigData a = 10;


// 함수 호출뒤에도 a의 값은 변경 되면 안된다.

foo(a);


cout << a << endl; //10

}


int와 같은 표준타입은 컴파일러 최적화 도움을 받을 수 있기에 call by value로 하는게 좋고, 사용자 타입은 const type으로 전달하는게 좋다.


6. return by reference

void f1(int a) { }  // 복사본 생성.

void f1(int& a) { }  // 복사본 생성 안됨.


int x=10;

int f2() {return x;} // x의 복사본을 리턴함( 임시객체 ).

int& f3() {return x;} // x의 자체를 리턴함

int& f4() {int y = 10; return y;} // 지역변수 참조 리턴 - 미정의 동작 (undfined) - 이렇게 하면 안됨


int main()

{

int n = 10;

f1(x);


f2() = 20;  // 리턴용 임시객체는 lvalue가 될 수 없다.

f3() = 20;  // Ok. 전역변수 x에 20 넣기


cout << x< endl; // 20

};




7. rvalue reference (C++ 11)

int main()

{

int n = 0;


// rvalue : 등호의 오른쪽에만 놓을수 있다.

// lvalue : 등호의 오른쪽과 왼쪽에 모두 놓일수 있다.

n = 10; // OK.

10 = n; // Error.


// lvalue reference

int& r1 = n;   //  OK (n이라는 메모리의 별명을 가르킴)

int& r2 = 10;  //  Error (C++ 에서는 integer 참조가 상수를 가르킬 수 없음)


// rvalue reference

int&& r3 = n;   //  Error

int&& r4 = 10;  //  OK


const int& r5 = n;   //  OK

const int& r6 = 10;  //  OK

}



728x90

'프로그래밍언어 > C++' 카테고리의 다른 글

OOP Concept  (0) 2017.03.16
C++ Explicit Casting  (0) 2017.03.15
namespace  (0) 2017.03.15
동적 메모리 할당  (0) 2017.03.14
delete function, suffix return type, trailing return  (0) 2017.03.14
Comments