Dela via


Operator för funktionsanrop: ()

Ett funktionsanrop är en typ av postfix-expression, som bildas av ett uttryck som utvärderas till en funktion eller ett anropsbart objekt följt av funktionsanropsoperatorn . () Ett objekt kan deklarera en operator () funktion som tillhandahåller funktionsanropssemantik för objektet.

Syntax

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

Anmärkningar

Argumenten till funktionsanropsoperatorn kommer från en argument-expression-listkommaavgränsad lista med uttryck. Värdena för dessa uttryck skickas till funktionen som argument. Argument-expression-list kan vara tom. Före C++17 är ordningen för utvärdering av funktionsuttrycket och argumentuttrycken ospecificerad och kan förekomma i valfri ordning. I C++17 och senare utvärderas funktionsuttrycket före argumentuttryck eller standardargument. Argumentuttrycken utvärderas i en obestämd sekvens.

Utvärderas postfix-expression till funktionen som ska anropas. Det kan ha någon av flera former:

  • en funktionsidentifierare, synlig i det aktuella omfånget eller i omfånget för något av de angivna funktionsargumenten,
  • ett uttryck som utvärderas till en funktion, en funktionspekare, ett anropsbart objekt eller till en referens till en,
  • en medlemsfunktionsåtkomstor, antingen explicit eller underförstådd,
  • en derefererad pekare till en medlemsfunktion.

postfix-expression Kan vara en överbelastad funktionsidentifierare eller överbelastad medlemsfunktionsåtkomstor. Reglerna för överlagringsmatchning avgör den faktiska funktionen som ska anropas. Om medlemsfunktionen är virtuell bestäms funktionen som ska anropas vid körning.

Några exempeldeklarationer:

  • Funktionsreturtyp T. En exempeldeklaration är

    T func( int i );
    
  • Pekare till en funktion som returnerar typen T. En exempeldeklaration är

    T (*func)( int i );
    
  • Referens till en funktion som returnerar typen T. En exempeldeklaration är

    T (&func)(int i);
    
  • Funktionsreference för pekare till medlem returnerar typen T. Exempel på funktionsanrop är

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

Exempel

I följande exempel anropas standardbiblioteksfunktionen strcat_s med tre argument:

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

Resultat av funktionsanrop

Ett funktionsanrop utvärderas till ett rvalue såvida inte funktionen deklareras som en referenstyp. Funktioner med referensreturtyper utvärderas till lvalues. Dessa funktioner kan användas till vänster i en tilldelningssats, som du ser här:

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

Föregående kod definierar en klass med namnet Point, som innehåller privata dataobjekt som representerar x - och y-koordinater . Dessa dataobjekt måste ändras och deras värden hämtas. Det här programmet är bara en av flera designer för en sådan klass; användning av GetX funktionerna och SetX och GetYSetY är en annan möjlig design.

Funktioner som returnerar klasstyper, pekare till klasstyper eller referenser till klasstyper kan användas som vänster operand till operatorer för medlemsval. Följande kod är laglig:

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

Funktioner kan anropas rekursivt. Mer information om funktionsdeklarationer finns i Funktioner. Relaterat material finns i översättningsenheter och länkning.

Se även

Postfixuttryck
C++ inbyggda operatorer, prioritet och associativitet
Funktionsanrop