nakka soft world !
reference 본문
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
}
'프로그래밍언어 > 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 |