Menu

Fungsi C++: Deklarasi, Definisi, dan Pemanggilan (dengan Contoh)

Cara menulis fungsi di C++: anatomi tipe kembalian/nama/parameter, deklarasi vs definisi, mengembalikan nilai, fungsi void, dan jebakan seperti return yang hilang dan lupa menulis prototype.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Kenapa Fungsi Ada

Fungsi adalah blok kode bernama yang bisa kamu jalankan kapan saja dengan memanggil-nya. Daripada mengulang logika yang sama di beberapa tempat, kamu menulisnya sekali, memberinya nama, lalu memanggil nama itu di mana pun kamu membutuhkannya. Ini membuat program lebih pendek, lebih mudah dibaca, dan lebih mudah diperbaiki: ubah logikanya di satu tempat dan setiap pemanggil langsung mendapat pembaruannya.

Sebenarnya kamu sudah memanggil satu fungsi selama ini: main. Itulah titik masuk tempat setiap program C++ dimulai. Sekarang kamu akan menulis fungsimu sendiri. Loop yang kamu lihat sebelumnya, seperti range-based for, sering berada di dalam fungsi sehingga kamu bisa memakai ulang satu potong logika utuh lewat namanya.

Anatomi Sebuah Fungsi

Setiap fungsi punya empat bagian: tipe kembalian, nama, daftar parameter di dalam tanda kurung, dan isi di dalam kurung kurawal.

int add(int a, int b) {   // return type | name | parameters
    return a + b;         // body
}
  • int adalah tipe kembaliannya, yaitu jenis nilai yang dikembalikan fungsi.
  • add adalah nama yang kamu pakai untuk memanggilnya.
  • (int a, int b) adalah parameternya, yaitu input yang diberikan pemanggil.
  • Kurung kurawal menampung isinya, yaitu kode yang berjalan saat kamu memanggilnya.

Berikut contohnya dalam program lengkap. Mendefinisikan fungsi di atas main berarti main bisa melihatnya saat memanggilnya.

Pemanggilan add(2, 3) menjalankan fungsi dengan a = 2 dan b = 3, dan seluruh ekspresi itu menjadi nilai yang dikembalikan. Kamu bisa menyimpannya di variabel atau memakainya langsung di dalam ekspresi lain, seperti yang dilakukan baris cout kedua.

Mengembalikan Nilai

Pernyataan return melakukan dua hal: mengembalikan sebuah nilai ke pemanggil, dan langsung mengakhiri fungsi. Kode apa pun setelah return yang dijalankan tidak akan dieksekusi; kendali langsung melompat kembali ke tempat fungsi itu dipanggil.

Tipe nilai yang dikembalikan harus sama dengan (atau bisa dikonversi ke) tipe kembalian yang dideklarasikan. Fungsi yang dideklarasikan int seharusnya mengembalikan int; tidak mengembalikan apa pun, atau sampai di akhir fungsi tanpa return, adalah bug untuk fungsi non-void mana pun.

Fungsi void

Tidak setiap fungsi menghasilkan nilai. Saat sebuah fungsi hanya melakukan sesuatu, misalnya mencetak output atau memperbarui keadaan, tipe kembaliannya adalah void. Fungsi void bisa memakai return; saja untuk keluar lebih awal, atau cukup berjalan sampai kurung kurawal penutup.

Mencoba memakai hasil fungsi void, misalnya int x = greet("Ada");, adalah compile error, karena tidak ada nilai untuk diisikan. Kesalahan yang umum adalah menulis return someValue; di dalam fungsi void; compiler juga menolak itu.

Deklarasi vs. Definisi

C++ membaca file dari atas ke bawah, jadi secara default sebuah fungsi harus muncul sebelum kode yang memanggilnya. Kalau urutan itu merepotkan, kamu memecah fungsi menjadi deklarasi (disebut juga prototype) dan definisi.

Deklarasi menyatakan signature fungsi dan diakhiri titik koma, tanpa isi. Ia menjanjikan kepada compiler bahwa "fungsi ini ada; begini cara memanggilnya." Definisi lengkapnya lalu bisa menyusul nanti, bahkan setelah main.

Tanpa prototype di baris 4, compiler akan bertemu square(5) di dalam main sebelum pernah melihat square, dan build-nya gagal. Prototype juga merupakan cara file header membuat banyak source file bisa memakai fungsi yang sama. Perhatikan bahwa nama parameter di deklarasi bersifat opsional; int square(int); sama-sama berfungsi, karena bagi compiler yang penting hanya tipenya.

Kesalahan Umum

Beberapa jebakan berulang kali menjebak pemula:

  • Memanggil sebelum mendeklarasikan. Kalau kamu mendapat error "add was not declared in this scope", fungsinya didefinisikan di bawah pemanggilan pertamanya dan tidak punya prototype. Pindahkan definisinya ke atas atau tambahkan prototype.
  • Lupa melakukan return. Sampai di akhir fungsi non-void tanpa return adalah undefined behavior: pemanggil menerima sampah. Compile dengan warning menyala (-Wall) dan compiler akan menandainya.
  • Mendefinisikan vs. memanggil. Definisi punya isi di dalam kurung kurawal dan tanpa titik koma di akhir. Deklarasi punya titik koma dan tanpa isi. Mencampuradukkannya, misalnya menaruh titik koma tepat setelah daftar parameter fungsi yang ingin kamu definisikan, menghasilkan error yang membingungkan.
  • Mengabaikan nilai kembalian. add(2, 3); sendirian di satu baris bisa dikompilasi, tetapi hasil penjumlahannya diam-diam dibuang. Pastikan kamu benar-benar memakai apa yang dikembalikan fungsi.
// Looks like a definition, but the stray ; turns it into a
// declaration followed by a leftover block - a frequent typo:
int triple(int n);   // <- this ; ends the statement
{
    return n * 3;    // n is undefined here; this block is now orphaned
}

Berikutnya: Parameter Fungsi

Kamu sudah melihat fungsi menerima input lewat daftar parameternya, tetapi masih banyak yang bisa dibahas. Halaman berikutnya mendalami parameter fungsi: pass by value versus pass by reference, argumen default, parameter const, dan bagaimana pilihanmu menentukan apakah fungsimu bisa mengubah data milik pemanggil.

Pertanyaan yang sering diajukan

Bagaimana cara menulis fungsi di C++?

Beri fungsi itu tipe kembalian, nama, tanda kurung untuk parameter, dan isi di dalam kurung kurawal: int add(int a, int b) { return a + b; }. Panggil dengan namanya dan argumennya, seperti add(2, 3). Kalau fungsi itu tidak mengembalikan apa pun, pakai void sebagai tipe kembaliannya.

Apa perbedaan deklarasi dan definisi fungsi di C++?

Deklarasi (atau prototype) memberi tahu compiler nama, tipe kembalian, dan parameter sebuah fungsi, dan diakhiri titik koma: int add(int a, int b);. Definisi juga menyertakan isinya di dalam kurung kurawal. Kamu bisa mendeklarasikan fungsi sebelum main dan mendefinisikannya nanti; deklarasi itu membuatmu bisa memanggilnya sebelum definisinya muncul.

Apa yang terjadi kalau fungsi C++ tidak mengembalikan nilai?

Untuk fungsi void, tidak terjadi apa-apa: fungsi itu selesai begitu saja. Namun untuk fungsi non-void, sampai di akhir fungsi tanpa return adalah undefined behavior: pemanggil mendapat nilai sampah dan program bisa berperilaku aneh. Sebagian besar compiler memperingatkan hal ini; selalu kembalikan nilai di setiap jalur fungsi non-void.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai