Operatore di chiamata di funzione: ()

Una chiamata di funzione è un tipo di postfix-expression, formato da un'espressione che restituisce una funzione o un oggetto chiamabile seguito dall'operatore di chiamata di funzione , (). Un oggetto può dichiarare una operator () funzione, che fornisce la semantica delle chiamate di funzione per l'oggetto .

Sintassi

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

Osservazioni:

Gli argomenti dell'operatore di chiamata di funzione provengono da un argument-expression-listoggetto , un elenco delimitato da virgole di espressioni. I valori di queste espressioni vengono passati alla funzione come argomenti. L'argomento-expression-list può essere vuoto. Prima di C++17, l'ordine di valutazione dell'espressione di funzione e delle espressioni di argomento non è specificato e può verificarsi in qualsiasi ordine. In C++17 e versioni successive l'espressione di funzione viene valutata prima di qualsiasi espressione di argomento o argomenti predefiniti. Le espressioni di argomento vengono valutate in una sequenza indeterminato.

Restituisce postfix-expression la funzione da chiamare. Può assumere una qualsiasi forma:

  • un identificatore di funzione, visibile nell'ambito corrente o nell'ambito di uno degli argomenti della funzione forniti,
  • espressione che restituisce una funzione, un puntatore a funzione, un oggetto chiamabile o un riferimento a uno,
  • funzione di accesso a una funzione membro, esplicita o implicita,
  • puntatore dereferenziato a una funzione membro.

postfix-expression Può essere un identificatore di funzione di overload o una funzione di accesso membro in overload. Le regole per la risoluzione dell'overload determinano la funzione effettiva da chiamare. Se la funzione membro è virtuale, la funzione da chiamare viene determinata in fase di esecuzione.

Alcune dichiarazioni di esempio:

  • Funzione che restituisce il tipo T. Una dichiarazione di esempio è

    T func( int i );
    
  • Puntatore a una funzione che restituisce il tipo T. Una dichiarazione di esempio è

    T (*func)( int i );
    
  • Riferimento a una funzione che restituisce il tipo T. Una dichiarazione di esempio è

    T (&func)(int i);
    
  • Deferenziazione della funzione puntatore a membro che restituisce il tipo T. Le chiamate di funzione di esempio sono

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

Esempio

Nell'esempio seguente viene chiamata la funzione della libreria standard strcat_s con tre argomenti:

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

Risultati della chiamata di funzione

Una chiamata di funzione restituisce un rvalue a meno che la funzione non sia dichiarata come tipo riferimento. Le funzioni con tipi restituiti di riferimento restituiscono lvalues. Queste funzioni possono essere usate sul lato sinistro di un'istruzione di assegnazione, come illustrato di seguito:

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

Il codice precedente definisce una classe denominata Point, che contiene oggetti dati privati che rappresentano coordinate x e y . È necessario modificare tali oggetti e recuperare i relativi valori. Questo programma rappresenta una delle diverse progettazioni possibili per tale classe. Un'altra progettazione valida consiste nell'utilizzo delle funzioni GetX e SetX o GetY e SetY.

Le funzioni che restituiscono tipi di classe, i puntatori ai tipi di classe o i riferimenti ai tipi di classe possono essere utilizzati come operando a sinistra degli operatori di selezione dei membri. Il codice seguente è valido:

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

Le funzioni possono essere chiamate in modo ricorsivo. Per altre informazioni sulle dichiarazioni di funzione, vedere Funzioni. Il materiale correlato si trova in unità di traduzione e collegamento.

Vedi anche

Espressioni di postfissi
Operatori, precedenza e associatività predefiniti C++
Chiamata di funzione