1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
using namespace std;
 
int main()
{
    int num1 = 1020;        // 변수 선언
    int &num2 = num1;        // 참조자 선언
 
    num2 = 3047;
 
    cout << "Val: " << num1 << endl;        // 3047
    cout << "Ref: " << num2 << endl;        // 3047
 
    cout << "Val: " << &num1 << endl;
    cout << "Ref: " << &num2 << endl;        // &num1 과 &num2의 값은 같다
                                            
    int &num3 = num2;                        // 참조자를 대상으로 참조자 선언
    cout << "num2: " << num2 << endl;
    cout << "num3: " << num3 << endl;
 
    // int &ref = 20;        // 참조자는 변수에 대해서만 선언 가능
    // int %ref;            // 참조자는 미리 선언했다가 후에 참조 불가, 참조 대상 변경 불가
    // int &ref = NULL;     // NULL로 초기화 불가
 
    int num = 12;
    int *ptr = &num;
    int **dptr = &ptr;
 
    int &ref = num;            // 변수 참조
    int *(&pref) = ptr;        // 포인터 변수 참조
    int **(&dpref) = dptr;    // 더블 포인터 변수 참조
 
    cout << ref << endl;
    cout << *pref << endl;
    cout << **dpref << endl;
}
cs




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
using namespace std;
 
// Call-by-value 함수
// 주소 값을 이용해 함수의 외부에 선언된 변수에 접근하는 형태가 아님
int* SimpleFunc(int *ptr)
{
    return ptr + 1;
}
 
// Call-by-reference
void SwapByRef(int &ref1, int &ref2)
{
    int temp = ref1;
    ref1 = ref2;
    ref2 = temp;
}
 
// const로 참조자를 선언시, 참조자 ref를 통한 값의 변경을 허용하지 않음
void HappyFunc(const int &ref)
{
 
}
 
 
// 반환형이 참조형
int& RefRetFuncOne(int &ref)
{
    ref++;
    return ref;
}
 
// 반환형이 값
int RefRetFuncTwo(int &ref)
{
    ref++;
    return ref;
}
 
// 지역 변수를 참조형으로 반환하면 안된다.
int& RefRetFuncThree(int n)
{
    int num = 20;
    num += n;
    return num;
}
 
int main()
{
    int val1 = 10;
    int val2 = 20;
    SwapByRef(val1, val2);
    cout << "val1: " << val1 << endl;
    cout << "val2: " << val2 << endl;
 
 
    // 반환형이 참조형인 경우, 반환 값을 무엇으로 저장하느냐에 따라 결과에 차이가 있다.
    int num1 = 1;
    int &num2 = RefRetFuncOne(num1);    // 참조형으로 반환된 값을 참조자에 저장
    int num3 = RefRetFuncOne(num1);        // 참조형으로 반환된 값을 변수에 저장
 
    num1++;
    num2++;
    num3++;
    cout << "num1: " << num1 << endl;
    cout << "num2: " << num2 << endl;
    cout << "num3: " << num3 << endl;
 
    // 반환형이 값인 경우, 값이 반환되므로 반드시 변수에 저장해야 한다.
    int num4 = 1;
    int num5 = RefRetFuncTwo(num4);
 
    num4 += 50;
    num5 += 100;
    cout << "num4: " << num4 << endl;
    cout << "num5: " << num5 << endl;
 
    // int &num6 = RefRetFuncTwo(num4);        // 에러
 
    int &num7 = RefRetFuncThree(10);        // 지역 변수는 소멸되므로 참조형으로 반환하면 안된다.
    cout << "num7: " << num7 << endl;
}
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
int Adder(const int &num1, const int &num2)
{
    return num1 + num2;
}
 
int main()
{
    const int num = 20;
//    int &ref = num;                    // 에러 참조 불가
 
    const int &ref = num;            // 상수화된 변수에 대한 참조자 선언
 
    const int &ref2 = 50;            // 상수 참조 가능, 임시 변수 상수화
 
    cout << Adder(34<< endl;    // const의 상수 참조
}
cs


+ Recent posts