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

    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;를 자동으로 삽입한다
    반응형

    댓글

    Designed by JB FACTORY