Sejak Chapter pertama kita sebenarnya sudah menulis fungsi — main() adalah fungsi, dan di Section Control Flow kita sempat meminjam dua fungsi kecil sebagai tempat berlabuh pernyataan return. Kini saatnya membahasnya secara tuntas: fungsi adalah blok kode bernama yang membungkus satu tugas sehingga bisa dipanggil berulang kali tanpa menyalin-tempel logikanya. Program besar dibangun dari puluhan hingga ribuan fungsi kecil, bukan dari satu main() panjang berisi ribuan baris. Pada Chapter ini kita membedah anatomi definisi fungsi, mengenal fungsi void, dan memahami aturan urutan penulisan yang membuat compiler mau atau menolak menemukan fungsi kita.
Anatomi Sebuah Fungsi #
Definisi fungsi terdiri atas empat komponen yang selalu sama: return type, nama, parameter list, dan body. Return type menyatakan jenis nilai yang dikembalikan fungsi, nama dipakai pemanggil untuk memanggilnya, parameter list menampung masukan, dan body berisi pernyataan yang dijalankan. Program berikut mendefinisikan dua fungsi dengan wujud yang berbeda:
#include <iostream>
#include <string>
// Fungsi dengan return value: menerima dua int, mengembalikan jumlahnya
int jumlahkan(int a, int b) {
int hasil = a + b;
return hasil;
}
// Fungsi void: mencetak salam, tidak mengembalikan nilai apa pun
void sapa(std::string nama) {
std::cout << "Halo, " << nama << "! Selamat belajar C++.\n";
}
int main() {
int total = jumlahkan(3, 4);
std::cout << "3 + 4 = " << total << "\n";
sapa("Budi");
sapa("Siti");
return 0;
}Output yang Dihasilkan:
3 + 4 = 7
Halo, Budi! Selamat belajar C++.
Halo, Siti! Selamat belajar C++.Mari kita bedah strukturnya baris demi baris:
- Baris 6 (
int jumlahkan(int a, int b)): return typeintmenjanjikan fungsi menghasilkan satu bilangan bulat;jumlahkanadalah nama fungsinya; dan(int a, int b)adalah parameter list berisi dua masukan bertipeint. - Baris 7-9 (body): badan fungsi dibungkus kurung kurawal. Variabel lokal
hasilhanya hidup di dalam fungsi ini, lalureturn hasilmenyerahkan nilainya kepada pemanggil. - Baris 13 (
void sapa(...)): return typevoidberarti fungsi tidak mengembalikan apa pun — tugasnya mencetak, lalu selesai. Parameternamabertipestd::string, tipe teks standar yang sudah kita pakai sejak awal course ini. - Baris 19 (
jumlahkan(3, 4)): memanggil fungsi berarti mengeksekusi body-nya dengan masukan yang diberikan. Nilai kembaliannya menempati posisi ekspresi, sehingga bisa langsung disimpan ketotalatau dicetak.
Nama fungsi mengikuti aturan penamaan variabel yang kita pelajari pada Section Variabel dan Tipe Data. Konvensi yang lazim di C++ adalah camelCase untuk fungsi — hitungTotal, tampilkanProfil — agar mudah dibedakan dari tipe dan class.
Fungsi void: Menjalankan Tugas Tanpa Hasil #
Tidak semua tugas menghasilkan nilai; mencetak laporan atau menulis log hanyalah aksi. Untuk tugas semacam ini kita pakai return type void, sebagaimana sapa di atas. Fungsi void boleh dipanggil sebagai pernyataan berdiri sendiri, tetapi tidak bisa dipakai di dalam ekspresi — int x = sapa("Budi"); ditolak compiler karena tidak ada nilai yang bisa ditampung. Fungsi void yang mencapai kurung kurawal penutup tanpa return pun berakhir dengan wajar; kita sudah membahas return; tanpa nilai pada Chapter return di Section Control Flow.
Urutan Penulisan: Sebelum atau Sesudah main() #
Compiler membaca file dari atas ke bawah dalam satu lintasan. Saat menemui nama fungsi, compiler hanya mengenalinya bila definisi atau deklarasi fungsi itu sudah lewat di atasnya. Karena itu konvensi paling umum adalah mendefinisikan fungsi-fungsi pembantu SEBELUM main(), seperti salam-lengkap.cpp di atas. Bila urutannya dibalik, compiler menolak program kita:
#include <iostream>
#include <string>
int main() {
sapa("Budi"); // compiler belum pernah melihat nama "sapa"
return 0;
}
void sapa(std::string nama) {
std::cout << "Halo, " << nama << "!\n";
}Kompilasi potongan ini dengan g++ -std=c++23 -Wall -Wextra benar-benar gagal dengan pesan berikut — kita salin apa adanya dari compiler kami:
urutan-salah.cpp: In function ‘int main()’:
urutan-salah.cpp:5:5: error: ‘sapa’ was not declared in this scope
5 | sapa("Budi"); // compiler belum pernah melihat nama "sapa"
| ^~~~Pesan 'sapa' was not declared in this scope berarti pada titik pemanggilan, compiler belum menemukan deklarasi nama itu di mana pun. Logikanya masuk akal: compiler tidak menebak-nebak isi file di bawah, ia hanya menimbun apa yang sudah ia baca. Ada dua cara membetulkannya, dan keduanya akan kita bahas: memindahkan definisi ke atas main() seperti contoh pertama, atau menuliskan deklarasi singkat bernama function prototype — topik utuh Chapter berikutnya.
Rujukan resmi tentang definisi fungsi ada di cppreference: functions . Setelah anatomi dan urutan penulisannya paham, langkah berikutnya adalah menguasai prototipe — perangkat yang membuat urutan definisi tidak lagi menjadi beban.