📕 Book/모던C++입문

[모던C++입문] 1.5 함수

테디슨 2021. 7. 3. 12:35

1.5 함수

인수

값에 의한 호출 (call by value)

void increment(int x)
{
    x++
}

void main()
{
    int i = 4;
    increment(i);           //i를 증가 시키지 않음
    cout << "i is " << i << endl;
}

래퍼런스에 의한 호출 (pass by reference)

void increment(int& x)
{
    x++;
}
increment(i+9); //오류 임시변수는 참조 불가

double two_norm(const vector& v) {...}      //상수 레퍼런스
  • 값으로 전달하는 인수들은 복사본으로 동작하기에 함수안에서 변경 가능
  • const 레퍼런스는 할당의 좌변에 나타나거나 const가 아닌 레퍼런스로는 전달 불가

기본값

double root(double x, int degree = 2) { ... }

x = root(3.5, 3);
y = root(7.0);      //root(7.0, 2) 와 동일
  • 인수목록의 끝에서만 여러 개의 기본값 선언 가능

결과 반환

아무것도 반환하지 않기

  • void는 실제 타입이 아니라 값 반환을 생략할 수 있는 자리표시자(placeholder)
  • void함수는 인수가 없는 return을 통해 함수를 일찍 종료 가능
void print_x(int x)
{
    std::cout << "The value x is " << x << std::endl;
}

void nothing;       //void 개체를 정의할수 없음 ('void' 형식을 잘못 사용했습니다.)

void Heavy_compute(int x, int y)
{
    for( ... )
    {
        if( ... )
            return;
    }
}

인라인

  • 함수를 호출하는데 드는 비용이 많이 듬
  • 인라인은 컴파일러가 함수에 포함된 연산을 호출을 대체하도록 함
inline double square(double x) { return x * x; }

오버로딩 (function overloading)

  • 매개변수 선언이 다르면 같은 함수이름을 공유할 수 있다
int divide(int a, int b)
{
    return a / b;
}

float divide(float a, float b)
{
    return std::floor(a / b);
}

int main()
{
    int x = 5, y = 2;
    float n = 5.0, m = 2.0;
    cout << divide(x, y) << endl;
    cout << divide(n, m) << endl;  
    cout << divide(x, m) << endl;   //빌드 오류 : 모호하다
}
  1. 인수 타입과 정확히 일치하는 함수가 있는가?
  2. 변환후 일치하는 함수가 있는가
    1. 0개 : 오류, 일치하는 함수를 찾을수 없다
    2. 1개 : 해당 함수를 호출
    3. 1개 이상 : 오류, 모호한 호출
  • 함수의 오버로는 시그니처(signature)가 서로 달라야 한다
    • 함수 이름
    • 항(Arity)이라고 하는 인자의 개수
    • 인자의 타입 (순서대로)
void foo(int x) {}
void foo(int y) {}  //오류: 인수 이름만 다르다
long foo(int x) {}  //오류: 반환 타입만 다르다

void f(int x) {}
void f(int& x) {}
void f(const int& x) {}

int main()
{
    int i = 3;
    const int ci = 4;
    f(3);
    f(i);
    f(ci);
    //함수 호출이 모호 해진다
    //f(int x)를 생략해야 정상 동작함
    //f(3)과 f(ci)는 f(const int& x)로
    //f(i)는 (f int& x)로 호출됨
}

main 함수

  • main함수의 표준 시그니처는 2가지가 있다
int main()

int main(int argc, char* argv[]) //혹은
int main(int argc, char** argv[])

argc_argv_test.cpp
int main(int argc, char* argv[])
{
    for(int i = 0; i < argc; ++i)
    {
        cout << argv[i] << endl;
    }
}

//프로그램 호출 옵션 값
argc_argv_test first second third fourth

//출력 결과
argc_argv_test
first
second
third
fourth
  • main함수는 return문을 생략하더라도 return 0;를 자동으로 삽입한다
반응형