Compartilhar via


Operador de chamada da função: ()

Uma chamada de função é uma espécie de postfix-expression, formado por uma expressão que é avaliada como uma função ou objeto chamável seguido pelo operador de chamada de função, (). Um objeto pode declarar uma função operator (), que fornece semântica de chamada de função para o objeto.

Sintaxe

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

Comentários

Os argumentos para o operador de chamada de função vêm de argument-expression-list, uma lista de expressões separada por vírgulas. Os valores dessas expressões são passados à função como argumentos. O argument-expression-list pode estar vazio. Antes do C++17, a ordem de avaliação da expressão da função e das expressões de argumento não é especificada e pode ocorrer em qualquer ordem. No C++17 e posteriores, a expressão de função é avaliada antes de qualquer expressão de argumento ou argumentos padrão. As expressões de argumento são avaliadas em uma sequência indeterminada.

A função postfix-expression a ser chamada é avaliada. Ela pode assumir qualquer uma destas várias formas:

  • um identificador de função, visível no escopo atual ou no escopo de qualquer um dos argumentos de função fornecidos,
  • uma expressão avaliada como uma função, um ponteiro de função, um objeto que pode ser chamado ou uma referência a um,
  • um acessador de função de membro, explícito ou implícito,
  • um ponteiro desreferenciado para uma função de membro.

O postfix-expression ser um identificador de função sobrecarregado ou um acessador de função membro sobrecarregado. As regras para resolução de sobrecarga determinam a função real a ser chamada. Se a função membro for virtual, a função a ser chamada será determinada em tempo de execução.

Algumas declarações de exemplo:

  • Tipo de retorno de função T. Uma declaração de exemplo é

    T func( int i );
    
  • Tipo de retorno de ponteiro para uma função T. Uma declaração de exemplo é

    T (*func)( int i );
    
  • Tipo de retorno de referência para uma função T. Uma declaração de exemplo é

    T (&func)(int i);
    
  • Tipo de retorno de desreferência de ponteiro para função de membro T. As chamadas de função de exemplo são

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

Exemplo

O exemplo a seguir chama a função de biblioteca padrão strcat_s com três argumentos:

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

Resultados de chamada de função

Uma chamada de função é avaliada como um rvalue, a menos que a função seja declarada como do tipo de referência. Funções com tipos de retorno de referência são avaliadas como lvalues. Essas funções podem ser usadas no lado esquerdo de uma instrução de atribuição, conforme visto aqui:

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

O código anterior define uma classe chamada Point, que contém os objetos de dados privados que representam as coordenadas x e y. Esses objetos de dados devem ser alterados e seus valores recuperados. Esse programa é apenas um de vários projetos para essa classe; o uso das funções GetX e SetX ou GetY e SetY é outro projeto possível.

As funções que retornam tipos de classe, os ponteiros para tipos de classe ou referências a tipos de classe podem ser usados como o operando à esquerda para operadores de seleção de membros. O seguinte código é legal:

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

As funções podem ser chamadas recursivamente. Para saber mais sobre declaração da função, confira Funções. O material relacionado está em Unidades de conversão e vínculo.

Confira também

Expressões Pós-fixada
Operadores internos, precedência e associatividade no C++
Chamada de função