본문 바로가기
카테고리 없음

C++ 오버로딩

by 리승연 2018. 9. 15.
반응형

 같은 클래스 내에서 같은 이름의 함수를 사용하는 것은 의미한다. 즉 사용자가 정의한 함수명을 매개 변수 리스트에 따라 하나의 유일한 이름의 함수명으로 결정하는 것이다.

 

오버로딩 조건

 

 ○중복된 함수들의 이름이 동일해야 한다.

 

 ○중복된 함수들은 매개변수의 가 다르거나, 매개변수의 개수가 같고 타입이 달라야 한다.

 

 ○위의 두 조건을 모두 만족하면 반환형의 차이는 함수 오버로딩에 영향을 미치지 않는다.(리턴타입상관없음)

 

 

 

오버로딩 성공

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int sum(int x, int y, int z) {
    return x + y + z;
}
double sum(double x, double y) {
    return x + y;
}
 
int sum(int x, int y) {
    return x + y;
}
 
int main() {
    cout << sum(2323<< "\n";
    cout << sum(2.233.23<< "\n";
    cout << sum(2,3);
 
}
cs

 main()안에 중복된 sum() 함수 호출, 컴파일러가 구분

 

 중복된 sum() 함수

 

 

 

오버로딩 실패

 

 어떤 sum() 함수인지 컴파일러가 구분할 수 없음

 

 

 

 

 

디폴트 매개 변수 선언

 

 디폴트 매개 변수 선언 형태

 

 매개 변수 = 디폴트 값

 

 디폴트 매개변수를 가진 함수 star()

 

1
void star(int a = 5); //a의 디폴트 값 5
cs

 

 

 

 디폴트 매개 변수를 가진 함수를 호출할 때 디폴트 매개변수에 값을 주어도 되고 생략해도 된다.

 

1
2
star(); //매개 변수 a에 디폴트 값 5 자동전달, star(5)와 동일
star(10); //매개 변수 a에 10 전달
cs

 

 

 

 디폴트 매개변수에 디폴트 값을 전달하는 것은 컴파일러 에 의해 처리된다.

 

 

 

●디폴트 매개 변수 예제

 

 매개 변수 id와 디폴트 매개 변수 text를 가진 함수 msg()

 

1
2
void msg(int id, string text = "Hello")
 
cs

 

 

 

 msg()호출 방법

1
2
msg(10); //id에 10, text에 "Hello" 전달
msg(20"Good Morning"); //id에 20, text에 "Good Morning" 전달
cs

 

 

 함수 호출 시, 디폴트 매개 변수에 값을 전달하느 것은 선택 사항이지만, 보통 매개 변수에는 반드시 값을 전달해야한다. 

1
2
msg(); //컴파일 오류, 매개 변수 id에 값이 전달되지 않았음
msg("Good Morning"); //컴파일 오류, 매개 변수 id에 값이 전달 되지 않았음
cs

 

 

디폴트 매개 변수에 관한 제약 조건

 다폴트 매개 변수는 모두 끝 쪽에 선언되어야 한다. 디폴트 매개 변수는 보통 매개 변수 앞에 선언 불가능하다.

 

 


 

 

 

▶오버로딩:명시적오버로딩

 

 

 

명시적오버로딩+ reference 

 

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>
using namespace std;
 
void change(int &a, int &b);
void change(char &a, char &b);
void change(float &a, float &b);
 
void main() {
    int a = 10, b = 20;
    char c = 'A', d = 'B';
    float e = 3.7, f = 4.5;
 
    change(a, b);
    change(c, d);
    change(e, f);
 
    cout << a << "\t" << b << endl;
    cout << c << "\t" << d << endl;
    cout << e << "\t" << f << endl;
}
 
void change(int &a, int &b) {
    int box; 
    box = a;
    a = b;
    b = box;
}
 
void change(char &a, char &b) {
    char box;
    box = a;
    a = b;
    b = box;
}
 
void change(float &a, float &b) {
    float box;
    box = a;
    a = b;
    b = box;
}  
●결과
          Colored by Color Scripter
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
#include <iostream>
using namespace std;
/*
암시적 오버로딩 (디폴트인자값)
디폴트 인자값을 준 기준으로 뒤에 있는 매개변수는 무조건 추기화를 해주어야한다
 
디폴트인자값준 횟수 +1 만큼 호출
함수선언부에 디폴트인자값을 사용하고
함수정의부에는 사용을 하면 안된다
*/
int output(int a = 0int b = 0int c = 0);//함수선언
 
void main() {
    int a = 10, b = 20, c = 30;
 
    output();
    output(a);
    output(a, b);
    output(a, b, c);
}
 
int output(int a , int b , int c)//함수정의
{
    cout << a << b << c << endl;
}  
●결과
                                                        Colored by Color Scripter
cs

 

 

 

 

 

 


 

 

 

▶오버로딩과 오버라이딩 비교

 

    

 

 비교  오버로딩 오버라이딩 
 정의 매개 변수 타입이나 개수가 다르지만, 이름이 같은 함수들이 중복 작성하는 것  기본 클래스에 선언된 가상 함수를 파생 클래스에서 이름, 매개변수 타입, 매개 변수 개수, 리턴 타입까지 완벽히 같은 원형으로 재작성 하는 것 
 존재 외부 함수들 사이, 한 클래스의 멤버들, 상속관계  상속관계, 가상 함수에서만 적용 
 목적  이름이 같은 여러 개의 함수를 중복 작성하여 사용의 편의성 향상 기본 클래스에 구현된 가상 함수를 무시하고, 파생 클래스에서 새로운 기능을 재정의하고자 함 
 바인딩 정적 바인딩, 컴파일 시에 중복된 함수들의 호출 구분  동적 바인딩, 실행 시간에 오버라이딩된 함수를 찾아 실행 
관련 객체
지향 특성
다형성  다형성 

 

 

반응형