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-list
dipisahkan 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
T
pengembalian fungsi . Contoh deklarasi adalahT func( int i );
Penunjuk ke jenis
T
pengembalian fungsi . Contoh deklarasi adalahT (*func)( int i );
Referensi ke jenis
T
pengembalian fungsi . Contoh deklarasi adalahT (&func)(int i);
Jenis
T
pengembalian 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 GetY
SetY
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk