오버로딩
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 주소값을 각각 넣어준다.
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이 출력된 것을 확인될 수 있다.
주의할 점이 있다면 오른쪽부터 시작해서 매개변수 값을 줘야한다.
'C++ > 기초(두들낙서)' 카테고리의 다른 글
[C++기초] this 포인터 ,객체의 생성과 소멸,생성자와 소멸자 (0) | 2022.01.12 |
---|---|
[C++기초] 클래스 개념소개,접근제어 지시자,구조체와 클래스의 차이점 (0) | 2022.01.12 |
[C++기초] 네임스페이스 (0) | 2022.01.12 |
[C++기초]이차원 배열을 범위기반 for문으로 구현하기 (0) | 2022.01.12 |
[C++기초] 레퍼런스 변수 (0) | 2022.01.11 |
댓글