Opérateur Appel de fonction : ()

Un appel de fonction est un type de postfix-expressionformé par une expression qui prend la valeur d’une fonction ou d’un objet pouvant être appelé suivi de l’opérateur d’appel de fonction (). Un objet peut déclarer une fonction operator (), ce qui fournit la sémantique des appels de fonction pour l’objet.

Syntaxe

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

Notes

Les arguments de l’opérateur d’appel de fonction proviennent d’une liste argument-expression-list, une liste d’expressions séparées par des virgules. Les valeurs de ces expressions sont passées à la fonction en tant qu’arguments. argument-expression-list peut être vide. Avant C++17, l’ordre d’évaluation de l’expression de fonction et les expressions d’argument ne sont pas spécifiés et peuvent se produire dans n’importe quel ordre. En C++17 et versions ultérieures, l’expression de fonction est évaluée avant les expressions d’argument ou les arguments par défaut. Les expressions d’argument sont évaluées dans une séquence indéterminée.

L’expression postfix-expression évalue la fonction à appeler. Elle peut prendre l’une des formes suivantes :

  • un identificateur de fonction, visible dans l’étendue actuelle ou dans l’étendue de l’un des arguments de fonction fournis,
  • une expression qui prend la valeur d’une fonction, d’un pointeur de fonction, d’un objet pouvant être appelé ou qui prend la valeur d’une référence à une fonction,
  • un accesseur de fonction membre, explicite ou implicite,
  • un pointeur déréférencé vers une fonction membre.

L’expression postfix-expression peut être un identificateur de fonction surchargé ou d’un accesseur de fonction membre surchargé. Les règles de résolution de surcharge déterminent la fonction réelle à appeler. Si la fonction membre est virtuelle, la fonction à appeler est déterminée au moment de l’exécution.

Voici quelques exemples de déclarations :

  • Fonction retournant le type T. Voici un exemple de déclaration

    T func( int i );
    
  • Pointeur d'une fonction qui retourne le type T. Voici un exemple de déclaration

    T (*func)( int i );
    
  • Référence à une fonction qui retourne le type T. Voici un exemple de déclaration

    T (&func)(int i);
    
  • Déréférencement de fonction de pointeur de membre qui retourne le type T. Voici des exemples d'appels de fonction

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

Exemple

L’exemple suivant appelle la fonction de bibliothèque standard strcat_s avec trois arguments :

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

Résultats de l'appel de fonction

Un appel de fonction prend une valeur rvalue, sauf si la fonction est déclarée en tant que type de référence. Les fonctions avec des types de retour de référence sont évaluées en valeurs lvalue. Ces fonctions peuvent être utilisées du côté gauche d'une instruction d'assignation, de la manière suivante :

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

Le code précédent définit une classe appelée Point, qui contient les objets de données privés qui représentent les coordonnées x et y. Ces objets de données doivent être modifiés et leurs valeurs, récupérées. Ce programme n'est qu'une des nombreuses conceptions de ce type de classe ; l'utilisation des fonctions GetX et SetX ou GetY et SetY est une autre conception possible.

Les fonctions qui retournent des types de classe, des pointeurs vers des types de classe ou des références à des types de classe peuvent être utilisées comme opérande gauche pour les opérateurs de sélection de membres. Le code suivant est conforme :

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

Les fonctions peuvent être appelées de manière récursive. Pour plus d’informations sur les types de déclarations de fonction, consultez Fonctions. Les documents connexes se situent dans Unités de traduction et liaison.

Voir aussi

Expressions suffixées
Opérateurs intégrés, priorité et associativité C++
Appel de fonction