Operator wywołania funkcji: ()
Wywołanie funkcji jest rodzajem postfix-expression
, utworzonego przez wyrażenie, które oblicza obiekt funkcji lub obiekt wywoływany, a następnie operator wywołania funkcji, ()
. Obiekt może zadeklarować operator ()
funkcję, która zapewnia semantyka wywołań funkcji dla obiektu.
Składnia
postfix-expression
:
postfix-expression
(
argument-expression-list
opt)
Uwagi
Argumenty operatora wywołania funkcji pochodzą z argument-expression-list
rozdzielanej przecinkami listy wyrażeń. Wartości tych wyrażeń są przekazywane do funkcji jako argumenty. Lista-wyrażeń-argumentów może być pusta. Przed językiem C++17 kolejność obliczania wyrażenia funkcji i wyrażeń argumentów jest nieokreślona i może wystąpić w dowolnej kolejności. W języku C++17 lub nowszym wyrażenie funkcji jest obliczane przed wszelkimi wyrażeniami argumentów lub argumentami domyślnymi. Wyrażenia argumentów są obliczane w nieokreślonej sekwencji.
Funkcja postfix-expression
oblicza metodę w celu wywołania. Może to mieć dowolną z kilku form:
- identyfikator funkcji widoczny w bieżącym zakresie lub w zakresie dowolnych podanych argumentów funkcji,
- wyrażenie, które oblicza funkcję, wskaźnik funkcji, obiekt z możliwością wywołania lub odwołanie do funkcji,
- akcesor funkcji składowej, jawny lub dorozumiany,
- wskaźnik wyłuszony do funkcji składowej.
Element postfix-expression
może być przeciążonym identyfikatorem funkcji lub przeciążonym akcesorem funkcji składowej. Reguły rozpoznawania przeciążenia określają rzeczywistą funkcję do wywołania. Jeśli funkcja składowa jest wirtualna, funkcja do wywołania jest określana w czasie wykonywania.
Niektóre przykładowe deklaracje:
Funkcja zwracająca typ
T
. Przykładowa deklaracja toT func( int i );
Wskaźnik do funkcji zwracającej typ
T
. Przykładowa deklaracja toT (*func)( int i );
Odwołanie do funkcji zwracającej typ
T
. Przykładowa deklaracja toT (&func)(int i);
Wyłuszczenie funkcji wskaźnika do składowej zwraca typ
T
. Przykładowe wywołania funkcji to(pObject->*pmf)(); (Object.*pmf)();
Przykład
Poniższy przykład wywołuje funkcję strcat_s
biblioteki standardowej z trzema argumentami:
// 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++
Wyniki wywołania funkcji
Wywołanie funkcji oblicza wartość rvalue, chyba że funkcja jest zadeklarowana jako typ odwołania. Funkcje z typami zwracanymi odwołaniami obliczają wartość lvalues. Te funkcje mogą być używane po lewej stronie instrukcji przypisania, jak pokazano poniżej:
// 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";
}
Powyższy kod definiuje klasę o nazwie Point
, która zawiera prywatne obiekty danych reprezentujące współrzędne x i y . Te obiekty danych muszą być modyfikowane i pobierane ich wartości. Ten program jest tylko jednym z kilku projektów dla takiej klasy; GetX
użycie funkcji i i SetX
GetY
SetY
jest innym możliwym projektem.
Funkcje zwracające typy klas, wskaźniki do typów klas lub odwołania do typów klas mogą służyć jako lewy operand operatorów wyboru składowych. Poniższy kod jest legalny:
// 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 );
}
Funkcje mogą być wywoływane rekursywnie. Aby uzyskać więcej informacji na temat deklaracji funkcji, zobacz Funkcje. Powiązany materiał znajduje się w jednostkach tłumaczenia i łączeniu.
Zobacz też
Wyrażenia postfiksu
Wbudowane operatory, pierwszeństwo i kojarzenie języka C++
Wywołanie funkcji
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla