함수 호출 연산자: ()

함수 호출은 함수 또는 호출 가능한 개체 다음에 함수 호출 연산()자를 계산하는 식에 의해 형성되는 일종의 postfix-expression함수입니다. 개체는 개체에 operator () 대한 함수 호출 의미 체계를 제공하는 함수를 선언할 수 있습니다.

문법

postfix-expression:
  postfix-expression ( argument-expression-list opt )

비고

함수 호출 연산자에 대한 인수는 쉼표로 구분된 식 목록에서 가져옵니다 argument-expression-list. 이러한 식의 값은 함수에 인수로 전달됩니다. argument-expression-list는 비어 있을 수 있습니다. C++17 이전에는 함수 식과 인수 식의 계산 순서가 지정되지 않았으며 어떤 순서로든 발생할 수 있습니다. C++17 이상에서는 함수 식이 인수 식이나 기본 인수 앞에 평가됩니다. 인수 식은 확정되지 않은 시퀀스로 계산됩니다.

postfix-expression 호출할 함수로 평가됩니다. 다음과 같은 여러 가지 형식을 사용할 수 있습니다.

  • 현재 범위 또는 제공된 함수 인수의 범위에 표시되는 함수 식별자
  • 함수, 함수 포인터, 호출 가능한 개체 또는 함수에 대한 참조로 계산되는 식입니다.
  • 명시적 또는 묵시적 멤버 함수 접근자
  • 멤버 함수에 대한 역참조 포인터입니다.

오버 postfix-expression 로드된 함수 식별자 또는 오버로드된 멤버 함수 접근자일 수 있습니다. 오버로드 확인 규칙은 호출할 실제 함수를 결정합니다. 멤버 함수가 가상인 경우 호출할 함수는 런타임에 결정됩니다.

몇 가지 예제 선언은 다음과 같습니다.

  • 함수 반환 형식 T. 선언의 예는 다음과 같습니다.

    T func( int i );
    
  • 형식 T을 반환하는 함수에 대한 포인터입니다. 선언의 예는 다음과 같습니다.

    T (*func)( int i );
    
  • 형식 T을 반환하는 함수에 대한 참조입니다. 선언의 예는 다음과 같습니다.

    T (&func)(int i);
    
  • 멤버에 대한 포인터 함수 역참조 반환 형식 T. 함수 호출의 예는 다음과 같습니다.

    (pObject->*pmf)();
    (Object.*pmf)();
    

예시

다음 예제에서는 세 개의 인수를 사용하여 표준 라이브러리 함수 strcat_s 를 호출합니다.

// expre_Function_Call_Operator.cpp
// compile with: /EHsc

#include <iostream>
#include <string>

// C++ Standard Library name space
using namespace std;

int main()
{
    enum
    {
        sizeOfBuffer = 20
    };

    char s1[ sizeOfBuffer ] = "Welcome to ";
    char s2[ ] = "C++";

    strcat_s( s1, sizeOfBuffer, s2 );

    cout << s1 << endl;
}
Welcome to C++

함수 호출 결과

함수가 참조 형식으로 선언되지 않는 한 함수 호출은 rvalue로 평가됩니다. 참조 반환 형식이 있는 함수는 lvalues로 평가됩니다. 이러한 함수는 다음과 같이 대입 문의 왼쪽에서 사용할 수 있습니다.

// expre_Function_Call_Results.cpp
// compile with: /EHsc
#include <iostream>
class Point
{
public:
    // Define "accessor" functions as
    // reference types.
    unsigned& x() { return _x; }
    unsigned& y() { return _y; }
private:
    unsigned _x;
    unsigned _y;
};

using namespace std;
int main()
{
    Point ThePoint;

    ThePoint.x() = 7;           // Use x() as an l-value.
    unsigned y = ThePoint.y();  // Use y() as an r-value.

    // Use x() and y() as r-values.
    cout << "x = " << ThePoint.x() << "\n"
         << "y = " << ThePoint.y() << "\n";
}

앞의 코드는 x 및 y 좌표를 나타내는 프라이빗 데이터 개체를 포함하는 클래스를 Point정의합니다. 이러한 데이터 개체를 수정하고 해당 값을 검색해야 합니다. 이 프로그램은 이러한 클래스에 대한 여러 디자인 중 하나일 뿐입니다. 및 또는 GetYSetY 함수의 SetXGetX 사용은 또 다른 가능한 디자인입니다.

클래스 형식, 클래스 형식에 대한 포인터 또는 클래스 형식에 대한 참조를 반환하는 함수를 멤버 선택 연산자의 왼쪽 피연산자로 사용할 수 있습니다. 다음 코드는 유효합니다.

// expre_Function_Results2.cpp
class A {
public:
   A() {}
   A(int i) {}
   int SetA( int i ) {
      return (I = i);
   }

   int GetA() {
      return I;
   }

private:
   int I;
};

A func1() {
   A a = 0;
   return a;
}

A* func2() {
   A *a = new A();
   return a;
}

A& func3() {
   A *a = new A();
   A &b = *a;
   return b;
}

int main() {
   int iResult = func1().GetA();
   func2()->SetA( 3 );
   func3().SetA( 7 );
}

함수는 재귀적으로 호출할 수 있습니다. 함수 선언에 대한 자세한 내용은 Functions를 참조하세요. 관련 자료는 번역 단위 및 링크에 있습니다.

참고하십시오

후위 식
C++ 기본 제공 연산자, 우선 순위 및 결합성
함수 호출