함수 오버로딩(Function Overloading)

C++는 함수를 호출할 때 함수의 이름, 함수의 매개변수 두가지를 확인한다. 따라서 이름이 같은 Function이 존재하더라도 매개변수에 차이가 있으면 오류가 발생하지 않는다.

cf. C에서는 함수의 이름이 같을 경우 오류가 발생한다.

예시)

int f(int a, int b) {
    return a+b;
}

int f(int K) {
    return K;
}

int f(char c) {
    return c+65;
}
  • 오버로딩이 불가능한 경우
    int f(int n){
      return n;
    }
    
    float f(int n) {
      return (float)n;
    }
    

매개변수의 Default Value

int f(int n=10) {
    return n;
}

코드 해석: f를 호출할 때 매개변수가 전달되지 않는다면 n=10으로 설정한다.

int main(void) {
    f()         // 매개변수가 전달되지 않았으므로 n=10으로 설정됨
    f(2)       // 매개변수가 전달되었으므로 n=2로 설정됨
}

또한 함수의 매개변수가 여러 개인 경우, 전달되는 인자는 왼쪽부터 채워진다. 따라서 다음의 코드는 유효하지 않다. 즉, 오른쪽 매개변수의 Default Value부터 지정해야 한다.

// 올바르지 않은 예시
int f(int n1=10, int n2, int n3)
int f(int n1=10, int n2=10, int n3)

// 올바른 예시
int f(int n1, int n2, int n3=10)
int f(int n1, int n2=10, int n3=10)

인라인 함수(Inline Function)

선언하기

#include <iostream>
inline int POW(int x) {
    return x*x;
}

int main(void) {
    std::cout<<POW(10);
}

메크로 함수와의 비교

인라인 함수의 특징

  1. 자료형이 지정되어야 한다. (메크로 함수는 자료형이 지정되지 않는다. 따라서 데이터 손실도 발생하지 않는다.)
  2. 컴파일러에 의해 처리된다. (매크로 함수는 전처리기에 의해 처리된다.)
  3. 선언이 매크로 함수에 비해 쉽다.

Namespace

특정 영역에 이름을 붙여주기 위한 문법적 요소이다. 같은 이름의 함수로 인한 충돌을 막기 위해 사용된다.

#include <iostream>
namespace h1
{
    void f(int n) {
        return n;
    }
}

namespace h2
{
    void f(int n) {
        return n*n;
    }
}

int main(void) {
    h1::f(10);
    h2::f(10);
}

:: 을 범위지정 연산자(scope resolution operator)이라고 한다. Namespace를 지정할 때 사용한다.

Bool

새로운 자료형인 bool이 등장한다.

true

false

참조자(Reference)

int a1 = 1;
int &a2 = a1    // 참조자 a2 선언

참조자는 “변수에 별명을 하나 붙여주는 것”

  • a1의 주솟값과 a2의 주솟값은 동일하다.
  • 참조자는 변수에 대해서만 선언 가능하다. (상수에 대해서는 선언이 불가능하다.)
  • 포인터 변수도 변수이므로 참조자의 선언이 가능하다.
  • 선언과 동시에 특정 변수를 참조해야만 한다.

Call-by-Value와 Call-by-Reference

const

해당 참조자를 이용한 값을 변경하지 않겠음을 의미한다.