分享方式:


函式呼叫運算子:()

函式呼叫是一種 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 的成員指標函式取值 (Dereference)。 函式呼叫的範例如下

    (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++

函式呼叫結果

除非函式宣告為參考類型,否則函式呼叫會判斷值為右值。 具有參考傳回型別的函式會評估為 lvalue。 這些函式可使用於指派陳述式的左側,如下所示:

// 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";
}

上述程式碼會定義稱為 Point 的類別,其中包含表示 xy 座標的私人資料物件。 這些資料物件必須經過修改,而且必須擷取其值。 這個程式只是這種類別的數項設計之一,使用 GetXSetXGetYSetY 則是另一種可能的設計方式。

傳回類別類型、類別類型的指標或類別類型的參考之函式可以做為成員選擇運算子的左運算元使用。 下列程式碼是合法的:

// 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 );
}

函式可以透過遞迴方式呼叫。 如需函式宣告的詳細資訊,請參閱函式。 相關材料位於翻譯單元和連結

另請參閱

後置運算式
C++ 內建運算子、優先順序和順序關聯性
函式呼叫