Operátor volání funkce: ()
Volání funkce je druh postfix-expression
, tvořený výrazem, který se vyhodnotí jako funkce nebo volatelný objekt následovaný operátorem volání funkce, ()
. Objekt může deklarovat operator ()
funkci, která poskytuje sémantiku volání pro objekt.
Syntaxe
postfix-expression
:
postfix-expression
(
argument-expression-list
opt)
Poznámky
Argumenty operátoru volání funkce pocházejí ze argument-expression-list
seznamu výrazů oddělených čárkami. Hodnoty těchto výrazů se funkci předají jako argumenty. Seznam argument-expression-list může být prázdný. Před jazykem C++17 není zadáno pořadí vyhodnocení výrazu funkce a výrazy argumentů a může dojít v libovolném pořadí. V jazyce C++17 a novějším se výraz funkce vyhodnotí před libovolnými výrazy argumentů nebo výchozími argumenty. Výrazy argumentů se vyhodnocují v neurčité sekvenci.
Funkce postfix-expression
, která se má volat, vyhodnotí. Může mít některou z několika forem:
- identifikátor funkce, viditelný v aktuálním oboru nebo v rozsahu některého z zadaných argumentů funkce,
- výraz, který se vyhodnotí jako funkce, ukazatel funkce, volatelný objekt nebo odkaz na ho,
- přístupové objekty členské funkce, explicitní nebo implicitní,
- ukazatel na členovou funkci.
Může postfix-expression
to být identifikátor přetížené funkce nebo přetížené příslušenství členské funkce. Pravidla pro rozlišení přetížení určují skutečnou funkci, která se má volat. Pokud je členová funkce virtuální, funkce, která se má volat, se určí za běhu.
Příklady deklarací:
Návratový typ
T
funkce . Ukázková deklarace jeT func( int i );
Ukazatel na funkci vracející typ
T
. Ukázková deklarace jeT (*func)( int i );
Odkaz na funkci vracející typ
T
. Ukázková deklarace jeT (&func)(int i);
Návratový typ
T
funkce ukazatele na člen . Ukázková volání funkcí jsou(pObject->*pmf)(); (Object.*pmf)();
Příklad
Následující příklad volá standardní funkci strcat_s
knihovny se třemi argumenty:
// 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++
Výsledky volání funkce
Volání funkce se vyhodnotí jako rvalue, pokud není funkce deklarována jako typ odkazu. Funkce s návratovými typy odkazů se vyhodnocují jako lvalues. Tyto funkce se dají použít na levé straně příkazu přiřazení, jak je vidět tady:
// 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";
}
Předchozí kód definuje třídu s názvem Point
, která obsahuje privátní datové objekty, které představují souřadnice x a y . Tyto datové objekty musejí být upraveny a jejich hodnoty načteny. Tento program je pouze jednou z několika možností pro takovou třídu. Použití funkcí GetX
a SetX
nebo GetY
a SetY
představuje další možnost.
Funkce vracející typy tříd, ukazatele na typy tříd nebo odkazy na typy tříd lze použít jako levý operand pro operátory výběru členů. Následující kód je právní:
// 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 );
}
Funkce lze volat rekurzivně. Další informace o deklaracích funkcí najdete v tématu Funkce. Související materiál je v jednotkách překladu a propojení.
Viz také
Výrazy přípony
Integrované operátory jazyka C++, priorita a asociativita
Volání funkce
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro