Fungsi adalah blok kode yang bisa dipanggil berkali-kali dari bagian lain program. Bayangkan fungsi seperti tombol di mesin kopi — sekali kamu pasang programnya (“buat kopi”), kamu bisa tekan tombolnya kapan saja tanpa mengulang semua langkahnya. Dengan fungsi, kode menjadi lebih terorganisir, mudah dibaca, dan tidak berulang. Mari kita pelajari cara membuat fungsi di C++.
Anatomi Sebuah Fungsi
// Syntax dasar
tipe_return nama_fungsi(tipe param1, tipe param2) {
// isi fungsi
return nilai;
}
Contoh fungsi pertama:
#include <iostream>
using namespace std;
// Definisi fungsi
int tambah(int a, int b) {
return a + b;
}
int main() {
// Memanggil fungsi
int hasil = tambah(5, 3);
cout << "5 + 3 = " << hasil << endl;
// Output: 5 + 3 = 8
cout << "10 + 20 = " << tambah(10, 20) << endl;
// Output: 10 + 20 = 30
return 0;
}
Fungsi void (Tanpa Nilai Kembalian)
Jika fungsi tidak perlu mengembalikan nilai, gunakan tipe void:
void sapa(string nama) {
cout << "Halo, " << nama << "! Selamat datang." << endl;
}
void cetak_garis() {
cout << "=========================" << endl;
}
int main() {
cetak_garis();
sapa("Budi");
sapa("Sari");
cetak_garis();
return 0;
}
// Output:
// =========================
// Halo, Budi! Selamat datang.
// Halo, Sari! Selamat datang.
// =========================
Deklarasi Fungsi (Forward Declaration)
Di C++, fungsi harus didefinisikan sebelum dipanggil — atau kamu perlu deklarasi (prototype) terlebih dahulu:
#include <iostream>
using namespace std;
// Deklarasi (prototype) — cukup tuliskan signature-nya
double hitung_luas_lingkaran(double jari_jari);
void tampilkan_hasil(double luas);
int main() {
double r = 7.0;
double luas = hitung_luas_lingkaran(r);
tampilkan_hasil(luas);
return 0;
}
// Definisi bisa di bawah main()
double hitung_luas_lingkaran(double jari_jari) {
const double PI = 3.14159265;
return PI * jari_jari * jari_jari;
}
void tampilkan_hasil(double luas) {
cout << "Luas lingkaran: " << luas << endl;
// Output: Luas lingkaran: 153.938
}
Parameter Default (Default Arguments)
Kamu bisa memberikan nilai default untuk parameter — jika tidak diisi saat pemanggilan, nilai default yang digunakan:
void buat_kopi(string jenis = "Americano", int gula = 1, bool susu = false) {
cout << "Membuat " << jenis;
cout << " dengan " << gula << " sendok gula";
if (susu) cout << " dan susu";
cout << endl;
}
int main() {
buat_kopi(); // Menggunakan semua default
// Output: Membuat Americano dengan 1 sendok gula
buat_kopi("Latte", 2, true); // Isi semua parameter
// Output: Membuat Latte dengan 2 sendok gula dan susu
buat_kopi("Espresso"); // Hanya isi pertama
// Output: Membuat Espresso dengan 1 sendok gula
return 0;
}
Aturan: Parameter default harus berada di bagian kanan daftar parameter.
void f(int a = 1, int b)tidak valid;void f(int a, int b = 1)valid.
Function Overloading
C++ memungkinkan kamu membuat beberapa fungsi dengan nama sama tetapi parameter berbeda:
// Fungsi cetak untuk berbagai tipe data
void cetak(int angka) {
cout << "Integer: " << angka << endl;
}
void cetak(double desimal) {
cout << "Double: " << desimal << endl;
}
void cetak(string teks) {
cout << "String: " << teks << endl;
}
void cetak(int a, int b) {
cout << "Dua integer: " << a << " dan " << b << endl;
}
int main() {
cetak(42); // Output: Integer: 42
cetak(3.14); // Output: Double: 3.14
cetak("Halo"); // Output: String: Halo
cetak(10, 20); // Output: Dua integer: 10 dan 20
return 0;
}
Compiler memilih fungsi yang tepat berdasarkan tipe argumen yang diberikan.
Pass by Value vs Pass by Reference
Pass by Value (Default)
Fungsi menerima salinan dari argumen — mengubah parameter tidak mempengaruhi variabel asli:
void tambah_sepuluh(int x) {
x += 10; // hanya mengubah salinan
cout << "Di dalam fungsi: " << x << endl;
}
int main() {
int angka = 5;
tambah_sepuluh(angka);
// Output: Di dalam fungsi: 15
cout << "Di luar fungsi: " << angka << endl;
// Output: Di luar fungsi: 5 (tidak berubah!)
return 0;
}
Pass by Reference
Gunakan & agar fungsi bisa mengubah variabel asli:
void tukar(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 10, y = 20;
cout << "Sebelum: x=" << x << ", y=" << y << endl;
// Output: Sebelum: x=10, y=20
tukar(x, y);
cout << "Sesudah: x=" << x << ", y=" << y << endl;
// Output: Sesudah: x=20, y=10
return 0;
}
Contoh Nyata: Kalkulator Sederhana
#include <iostream>
using namespace std;
double tambah(double a, double b) { return a + b; }
double kurang(double a, double b) { return a - b; }
double kali(double a, double b) { return a * b; }
double bagi(double a, double b) {
if (b == 0) {
cout << "Error: Tidak bisa dibagi nol!" << endl;
return 0;
}
return a / b;
}
void tampilkan_menu() {
cout << "\n=== Kalkulator ===" << endl;
cout << "1. Penjumlahan" << endl;
cout << "2. Pengurangan" << endl;
cout << "3. Perkalian" << endl;
cout << "4. Pembagian" << endl;
cout << "Pilih: ";
}
int main() {
double a, b;
int pilihan;
tampilkan_menu();
cin >> pilihan;
cout << "Masukkan dua angka: ";
cin >> a >> b;
switch (pilihan) {
case 1: cout << "Hasil: " << tambah(a, b) << endl; break;
case 2: cout << "Hasil: " << kurang(a, b) << endl; break;
case 3: cout << "Hasil: " << kali(a, b) << endl; break;
case 4: cout << "Hasil: " << bagi(a, b) << endl; break;
default: cout << "Pilihan tidak valid!" << endl;
}
return 0;
}
Pertanyaan yang Sering Diajukan
Apa perbedaan deklarasi dan definisi fungsi?
Deklarasi (prototype) hanya memberi tahu compiler tentang nama, tipe return, dan parameter fungsi — tanpa isi. Definisi adalah fungsi lengkap dengan isi kode. Deklarasi berguna saat kamu ingin menulis main() di atas definisi fungsi lainnya, atau saat fungsi tersebar di beberapa file.
Kapan menggunakan pass by reference?
Gunakan pass by reference saat kamu perlu: (1) mengubah variabel asli dari dalam fungsi, atau (2) menghindari penyalinan objek besar yang mahal secara memori. Untuk parameter yang tidak akan diubah, gunakan const reference: void cetak(const string& teks).
Berapa banyak nilai yang bisa dikembalikan oleh fungsi?
Fungsi C++ hanya bisa mengembalikan satu nilai dengan return. Untuk mengembalikan banyak nilai, kamu bisa: (1) pass by reference untuk “mengisi” beberapa variabel, (2) menggunakan struct atau pair, atau (3) menggunakan tuple (C++11).
Apa itu function overloading dan kapan menggunakannya?
Overloading memungkinkan kamu membuat fungsi dengan nama sama tapi parameter berbeda. Ini berguna saat operasi yang sama perlu dilakukan untuk tipe data berbeda. Contoh: fungsi cetak() yang bisa menerima int, double, atau string. Ini membuat kode lebih bersih dibanding membuat cetakInt(), cetakDouble(), dan seterusnya.
Kesimpulan
Berikut ringkasan konsep fungsi di C++:
| Konsep | Penjelasan |
|---|---|
| Definisi fungsi | tipe nama(params) { ... return val; } |
| Fungsi void | Tidak mengembalikan nilai |
| Forward declaration | Prototype sebelum definisi |
| Default parameter | Nilai otomatis jika tidak diisi |
| Overloading | Nama sama, parameter berbeda |
| Pass by value | Fungsi menerima salinan |
Pass by reference (&) | Fungsi bisa ubah variabel asli |
Artikel sebelumnya: Percabangan dan Perulangan di C++ — cara membuat keputusan dan loop di C++.
Kamu sudah menyelesaikan fondasi C++! Langkah selanjutnya adalah mempelajari Object-Oriented Programming (OOP) untuk membangun program yang lebih kompleks dan terstruktur.