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

[C++] 함수와 구조체 / 함수 포인터 / 참조변수

by Meaning_ 2022. 7. 5.
728x90
반응형

함수와 구조체 

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
struct Time {
    int hours;
    int mins;
};
 
Time sum(Time*, Time*);
void showTime(Time);
 
Time sum(Time* t1, Time* t2) {
    Time total;
    //주소에 대해서 접근(포인터에 대해서 접근할 때는 ) ->
    //값에 대해서 접근할때는 . 
    total.mins = (t1->mins + t1->mins) % 60;
    total.hours = t1->hours + t2->hours + (t1->mins + t2->mins) / 60;
 
    return total;
}
 
void showTime(Time t1) {
    cout << t1.hours << "시간, " << t1.mins << "분 입니다." << endl;
}
 
int main() {
 
    Time day1 = { 5,45 };
    Time day2 = { 4,55 };
    Time total = sum(&day1, &day2);
    showTime(total);
 
}
cs

 

total 같은 값에서 구조체의 멤버로 접근할 때는 "."을 통해 접근한다. total.mins같이

t1같은 포인터에서 구조체의 멤버로 접근할 때는 "->"을 통해 접근한다. t1 -> hours 같이 

 

함수를 지시하는 포인터

어떤 함수에 함수의 주소를 매개변수를 넘겨주는 경우 유용하게 사용 가능

 

1. 함수의 주소를 얻는다.

2. 함수를 지시하는 포인터를 선언한다.

3. 함수를 지시하는 포인터를 사용하여 그 함수 호출 

 

int(*pf)(int); 는 int형 매개변수를 가지는 int형 함수 포인터 pf를 뜻한다. 

 

참조변수

 

참조 : 미리 정의된 변수의 실제 이름대신 사용할 수 있는 대용 이름.

함수의 매개변수에 사용.

 

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
void swapPointer(int* a, int* b) {
 
    int temp = *a;
    *a = *b;
    *b = temp;
 
}
 
void swapRef(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}
 
int main() {
    int a;
    int& b = a; //주소 연산자와 동일
 
    int moneyA = 200;
    int moneyB = 300;
 
    swapPointer(&moneyA, &moneyB);
    cout << "moneyA: " << moneyA << " moneyB: " << moneyB << endl;
 
    swapRef(moneyA, moneyB);
    cout << "moneyA: " << moneyA << " moneyB: " << moneyB << endl;
 
}
cs

 

값에 의한 호출과 달리 참조형으로 쓰게 되면 포인터 쓴 것 처럼 주소값이 전달돼서 두 값이 swap된다!

 

 

템플릿

 

함수 템플릿이란 함수의 일반화에 대한 서술이다.

구체적인 데이터형을 포괄할 수 있는 일반형으로 함수를 정의한다.

 

제네릭 프로그래밍처럼 코드를 쓰면 된다.

앞에 template을 붙여주고 class  Any로 설정해준다.

이 Any 클래스에 sum이라는 메서드를 넣어줄것이고 매개변수도 Any로 설정한다. (아직 어떤 자료형이 올지 모르기에!)

sum 메서드를 구체화해준다.

 

첫번째 sum은 매개변수 두개가 모두다 int형이기 때문에 int형 클래스가 된다.

두번째 sum은 매개변수가 두개가 모두 다 float형이기 때문에 float형 클래스가 된다.

문제는 마지막 sum인데 얘는 매개변수가 하나는 int, 하나는 float이다.

첫번째 파라미터가 int형이기 때문에 클래스가 int형으로 선언되는데 문제는 두번째 파라미터가 float이기 때문에 에러가 뜬다. 이럴 때는 메서드를 구현할 때 Any sum(int,Any) 로 해주면 된다. 

이렇게 두개를 추가해 주면 된다!

 

728x90
반응형

'C++ > 기초(두들낙서)' 카테고리의 다른 글

[C++] 이동 시맨틱  (0) 2022.07.10
[C++] 분할 컴파일/  (0) 2022.07.05
[C++] 멤버 메서드 활용하기  (0) 2022.07.02
[C++] 공용체와 열거체 / 포인터  (0) 2022.07.01
[C++] 정적 멤버 (static)  (0) 2022.07.01

댓글