函數呼叫運算子:
函式呼叫是一種 postfix-expression,由評估為函式或可呼叫對象的運算式所組成,後面接著函數調用運算子 ()。 物件可以宣告函 operator () 式,該函式會提供物件的函數調用語意。
語法
postfix-expression:
postfix-expression(argument-expression-listopt)
備註
函式呼叫運算子的自變數來自 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++
函數調用結果
除非函式宣告為參考型別,否則函數調用會評估為右值。 參考傳回型別的函式會評估為 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的類別,其中包含代表 x 和 y 座標的私人數據物件。 必須修改這些數據物件,並擷取其值。 此程式只是這類類別的數個設計之一;使用 GetX 和 SetX 和 GetY 函 SetY 式是另一個可能的設計。
傳回類別類型、類別型別指標或類別型別參考的函式,可以做為成員選取運算符的左作數。 下列程式代碼是合法的:
// 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 );
}
函式可以遞歸方式呼叫。 如需函式宣告的詳細資訊,請參閱 函式。 相關材料位於 翻譯單元和連結中。