본문 바로가기
프로그래밍 언어/C++

💻 함수 오버로딩(Overloading)

by 까망 하르방 2022. 8. 3.
반응형

함수 오버로딩 (overloading)

• 동일한 이름의 함수명이 여러개 중복 정의되어 있는 형태

• 함수 파라미터(parameter) 자료형 혹은 개수가 다르다.

• C 언어에서는 동일한 이름의 함수 정의를 허용하지 않는다. (컴파일 오류)

  하지만 C++에서는 함수 중복 정의 허용

void sub(int n) { … }
void sub(char* str) { … }
void sub(void) { … }
void sub(int n, char* str) { … }

 

 

오버로딩(중복 정의)이 안되는 경우

리턴 타입만 다른 경우

int sub(void) { … }

void sub(void) { … }

 

 

디폴트 파라미터(default parameter) 활용

중복 정의는 되지만 모호한 호출 오류 발생

void sub(void) { … }

void sub(int n = 5) { … }

 

 

모호한 레퍼런스 타입 활용

중복정의는 되지만 호출 오류 발생

int sub(int& rn) { … }

int sub(int n) { … }

 

 

포인터 인수 + 배열 인수

void sub(char* ptr) { … }

void sub(char str[]) { … }

void sub(const char* ptr) { … } // 중복정의 가능

 

 

const가 있는 value 인수 + 일반 value 인수

void sub(const int n) { … }

void sub(int n) { … }

 

 

예제

Stream 구조체로 다양한 타입 출력

#include <stdio.h>
#include <iostream>

using namespace std;

struct Stream
{
    void printf(int n);
    void printf(char c);
    void printf(double d);
    void printf(const char* s);
};

void Stream::printf(int n)
{
    // printf("%d", n); error
    ::printf("%d", n);
}

void Stream::printf(char c)
{
    ::printf("%c", c);
}

void Stream::printf(double d)
{
    ::printf("%lf", d);
}

void Stream::printf(const char* s)
{
    ::printf("%s", s);
}

int main(void) {
    Stream c;
    
    c.printf(5);
    c.printf('A');
    c.printf(3.14);
    c.printf("seoul");
}
반응형

댓글