본문 바로가기
C++/기초(두들낙서)

[C++기초] 오버로딩,디폴트 매개변수

by Meaning_ 2022. 1. 12.
728x90
반응형

오버로딩

 

int형을 swap해주고, double형을 swap해주는 함수를 만들어보자

 

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
#include <iostream>
#include<string>
 
void swap(int &a, int& b) {
    int tmp = a;
    a = b;
    b = tmp;
}
 
void swapd(double& a, double& b) {
    double tmp = a;
    a = b;
    b = tmp;
}
 
 
int main() {
 
    int a = 20;
    int b = 30;
    double da = 2.222, db = 3.333;
    swap(a, b);
    swapd(da, db);
    std::cout << "a: " << a << std::endl;
    std::cout << "b: " << b << std::endl
    std::cout << "da: " << da << std::endl;
    std::cout << "db: " << db << std::endl;
 
    
}
cs

 

출력값은

30

20

3.333

2.222

가 나올 것이다.

 

pa가 a를 가리키고 있고, pb가 b를 가리키고 있을 때  pa가 b를 가리키고 pb가 a를 가리키도록 코드를 짜보자.

예를 들어 a가 100번지이고, b가 104번지일때 pa에는 100, pb는 104가 들어있을 것이다. 이를 반대로 pa는 104,pb는 100이 들어가도록 해보자.

 

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
#include <iostream>
#include<string>
 
void swap(int &a, int& b) {
    int tmp = a;
    a = b;
    b = tmp;
}
 
void swapd(double& a, double& b) {
    double tmp = a;
    a = b;
    b = tmp;
}
 
void swapp(int*(&a),int*(&b)({
    int *tmp=a;
    a=b;
    b=tmp;
}
 
 
int main() {
 
    int a = 20;
    int b = 30;
    double da = 2.222, db = 3.333;
    int *pa=&a;
    int *pb=&b;
 
    swap(a, b);
    swapd(da, db);
    swapp(pa,pb);
    std::cout << "a: " << a << std::endl;
    std::cout << "b: " << b << std::endl
    std::cout << "da: " << da << std::endl;
    std::cout << "db: " << db << std::endl;
    std::cout << "*pa: " << *pa << std::endl;
    std::cout << "*pb: " << *pb << std::end
 
    
}
cs

이렇게 하면 두 포인터에 들어가있는 값이 뒤바뀔거다.

swapp를 더 자세히 뜯어보자.

 

우선 pa와 pb에 a,b 주소값을 각각 넣어준다.

void swapp(int*(&a),int*(&b)({
    int *tmp=a;
    a=b;
    b=tmp;
}
 
여기서 int*(&a)의 의미는 a는 레퍼런스 변수인데, 레퍼런스 변수 중에 int형 포인터를 가리키고 있는 레퍼런스 변수를
의미한다.
 
++) 다시 레퍼런스 변수 정리
레퍼런스 변수는 대입된 변수의 값과 주소값을 모두 그대로 가짐.

int *tmp=a; --> 이거는 a라는 레퍼런스 변수가 가리키고 있는 포인터의 주소값을 tmp에 담아준것을 의미한다.

 

 

함수 swad와 swapp는 자료형만 다를뿐 결국 하는 일은 같기 때문에 이름을 둘 다 swap이라 바꿔줄 수 있다.

 

그렇기에  함수 이름이 다 swap이여도 첫번째 swap에는 int형이 들어있기에 int를 매개변수로 받는 첫번째 swap함수를 선택해준다. 이걸 컴파일러가 알아서 판단한다.

 

오버로딩의 조건을 살펴보면

1. 함수의 이름이 같아야한다.

2. 함수의 매개변수 타입또는 개수가 달라야 한다.

 

디폴트 매개변수

 

게임 인벤토리에 아이템 아이디와, 아이템의 개수, 스코어를 저장하는 배열을 만들어보자.

 

아이템의 개수는 디폴트로 1을 주고, 아이템 스코어는 디폴트로 0을 준다.

getItem(6,5)를 하면 스코어값 0을 디폴트로 가지고

getItem(3)을 하면 아이템의 개수를 디폴트로 1을 가지고, 스코어값을 디폴트로 0을 가진다. 

 

3번째 인벤토리에는 cnt값을 딱히 주지 않았지만 디폴트값으로 1을 가져가기 때문에 inventory[3]=1이 출력된 것을 확인될 수 있다. 

주의할 점이 있다면 오른쪽부터 시작해서 매개변수 값을 줘야한다. 

 

 

 

728x90
반응형

댓글