Bagikan melalui


Operator Panggilan Fungsi: ()

Panggilan fungsi adalah semacam postfix-expression, yang dibentuk oleh ekspresi yang mengevaluasi ke fungsi atau objek yang dapat dipanggil diikuti oleh operator panggilan fungsi, (). Objek dapat mendeklarasikan operator () fungsi, yang menyediakan semantik panggilan fungsi untuk objek.

Sintaks

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

Keterangan

Argumen ke operator panggilan fungsi berasal dari daftar ekspresi yang argument-expression-listdipisahkan koma. Nilai ekspresi ini diteruskan ke fungsi sebagai argumen. Daftar ekspresi argumen bisa kosong. Sebelum C++17, urutan evaluasi ekspresi fungsi dan ekspresi argumen tidak ditentukan dan dapat terjadi dalam urutan apa pun. Di C++17 dan yang lebih baru, ekspresi fungsi dievaluasi sebelum ekspresi argumen atau argumen default. Ekspresi argumen dievaluasi dalam urutan yang tidak ditentukan.

postfix-expression Mengevaluasi ke fungsi yang akan dipanggil. Ini dapat mengambil salah satu dari beberapa bentuk:

  • pengidentifikasi fungsi, terlihat dalam cakupan saat ini atau dalam cakupan argumen fungsi apa pun yang disediakan,
  • ekspresi yang mengevaluasi ke fungsi, penunjuk fungsi, objek yang dapat dipanggil, atau ke referensi ke fungsi,
  • pengakses fungsi anggota, baik eksplisit atau tersirat,
  • penunjuk dereferensi ke fungsi anggota.

postfix-expression mungkin merupakan pengidentifikasi fungsi yang kelebihan beban atau aksesor fungsi anggota yang kelebihan beban. Aturan untuk resolusi kelebihan beban menentukan fungsi aktual yang akan dipanggil. Jika fungsi anggota virtual, fungsi yang akan dipanggil ditentukan pada waktu proses.

Beberapa contoh deklarasi:

  • Jenis Tpengembalian fungsi . Contoh deklarasi adalah

    T func( int i );
    
  • Penunjuk ke jenis Tpengembalian fungsi . Contoh deklarasi adalah

    T (*func)( int i );
    
  • Referensi ke jenis Tpengembalian fungsi . Contoh deklarasi adalah

    T (&func)(int i);
    
  • Jenis Tpengembalian dereferensi fungsi pointer-to-member . Contoh panggilan fungsi adalah

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

Contoh

Contoh berikut memanggil fungsi strcat_s pustaka standar dengan tiga argumen:

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

Hasil panggilan fungsi

Panggilan fungsi mengevaluasi ke rvalue kecuali fungsi dinyatakan sebagai jenis referensi. Fungsi dengan jenis pengembalian referensi dievaluasi ke lvalues. Fungsi-fungsi ini dapat digunakan di sisi kiri pernyataan penugasan, seperti yang terlihat di sini:

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

Kode sebelumnya mendefinisikan kelas yang disebut Point, yang berisi objek data privat yang mewakili koordinat x dan y . Objek data ini harus dimodifikasi dan nilainya diambil. Program ini hanya salah satu dari beberapa desain untuk kelas seperti itu; penggunaan GetX fungsi dan dan SetX dan GetYSetY adalah desain lain yang mungkin.

Fungsi yang mengembalikan jenis kelas, penunjuk ke jenis kelas, atau referensi ke jenis kelas dapat digunakan sebagai operand kiri ke operator pemilihan anggota. Kode berikut adalah 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 );
}

Fungsi dapat dipanggil secara rekursif. Untuk informasi selengkapnya tentang deklarasi fungsi, lihat Fungsi. Materi terkait ada di unit Terjemahan dan tautan.

Lihat juga

Ekspresi postfix
Operator, prioritas, dan associativitas bawaan C++
Panggilan fungsi