Pernyataan return sudah sering kita pakai — kita bahas perannya sebagai pengakhiri fungsi dan pengatur exit code pada Chapter return di Section Control Flow. Kali ini fokusnya adalah pasangannya: return type, janji yang tertulis di depan nama fungsi tentang jenis nilai yang akan dikembalikan. Return type bukan sekadar formalitas; ia menentukan di mana fungsi boleh dipakai, apa yang compiler periksa, dan bagaimana pemanggil mengolah hasilnya. Kita akan melihat fungsi dengan banyak jalur kembalian, aturan tegas bahwa return type wajib di C++, dan satu pengecualian terkenal: main() tanpa return.

Tipe Kembalian dan Banyak Jalur return #

Satu fungsi hanya boleh punya SATU return type, tetapi boleh punya banyak pernyataan return — asalkan setiap jalur eksekusi berakhir dengan nilai yang sesuai janji. Fungsi berikut punya tiga jalur kembalian di dalam satu fungsi diskon, ditambah fungsi boolean dengan dua jalur:

cpp
#include <iostream>
#include <string>

// Tiga jalur keluar, satu return type: double
double hitungDiskon(int total) {
    if (total >= 500000) {
        return 0.20;          // jalur 1: belanja besar
    }
    if (total >= 200000) {
        return 0.10;          // jalur 2: belanja sedang
    }
    return 0.0;               // jalur 3: tanpa diskon
}

// Return type bool: jawaban ya/tidak
bool isVokal(char huruf) {
    if (huruf == 'a' || huruf == 'i' || huruf == 'u' ||
        huruf == 'e' || huruf == 'o') {
        return true;
    }
    return false;
}

int main() {
    std::cout << "Diskon 600000: " << hitungDiskon(600000) << "\n";
    std::cout << "Diskon 250000: " << hitungDiskon(250000) << "\n";
    std::cout << "Diskon 50000:  " << hitungDiskon(50000) << "\n";

    std::cout << "'i' " << (isVokal('i') ? "vokal" : "bukan vokal") << "\n";
    std::cout << "'z' " << (isVokal('z') ? "vokal" : "bukan vokal") << "\n";
    return 0;
}

Output yang Dihasilkan:

text
Diskon 600000: 0.2
Diskon 250000: 0.1
Diskon 50000:  0
'i' vokal
'z' bukan vokal

Tiga hal yang perlu dicermati. Pertama, return mengakhiri fungsi SEGERA: saat hitungDiskon(600000) mencapai return 0.20, dua baris pengecekan di bawahnya tidak pernah dieksekusi — pola early return yang sudah kita kenal. Kedua, setiap nilai kembalian harus cocok dengan janji: 0.20 dan 0.0 adalah double, sesuai return type; nilai int yang dikembalikan di fungsi double akan dikonversi diam-diam, sedangkan kebalikannya (double ke int) memotong pecahan dan memicu peringatan. Ketiga, return type bool sangat cocok untuk fungsi predikat seperti isVokal — fungsi yang menjawab pertanyaan ya/tidak — dan hasilnya mudah dipakai di dalam kondisi if atau ternary seperti pada main().

Return Type Wajib Ditulis di C++ #

Berbeda dengan C klasik, C++ tidak pernah menebak return type yang tidak ditulis. Potongan berikut tampak wajar bagi mata yang biasa bahasa scripting, tetapi compiler C++ menolaknya — kami benar-benar menjalankan potongan ini untuk menangkap pesan aslinya:

cpp Potongan bermasalah: return type hilang
#include <iostream>

hitungDiskon(int total) {   // return type hilang
    return total * 0.1;
}

int main() {
    std::cout << hitungDiskon(1000) << "\n";
    return 0;
}

Pesan galat g++-nya: error: ISO C++ forbids declaration of 'hitungDiskon' with no type [-fpermissive]. Aturan ini warisan yang sengaja dipertahankan: pada C zaman dulu (K&R C), fungsi tanpa return type dianggap mengembalikan int secara implisit — kebebasan yang sering menimbulkan bug senyap. Standar C++ sejak awal meminta setiap fungsi menyatakan return type-nya secara eksplisit, sekecil apa pun fungsinya. Fungsi yang memang tidak mengembalikan apa pun menulis void, bukan kosong — dua hal yang tampak mirip tetapi maknanya berbeda jauh.

main() Tanpa return: 0 Secara Implisit #

Ada satu pengecualian yang terkenal: fungsi main() boleh berakhir tanpa pernyataan return, dan standar C++ menetapkan hasilnya 0 — artinya program sukses. Kita sudah membuktikannya secara nyata pada Chapter Struktur Program C++: program tanpa return di main() tetap berakhir dengan exit code 0. Kemudahan ini KHUSUS untuk main(); fungsi lain dengan return type int yang lolos tanpa return tetap undefined behavior.

Praktik yang kami anjurkan tetap menulis return 0; secara eksplisit di ujung main(), terutama bila ada jalur keluar berkode lain seperti yang kita buat pada Chapter return. Konsistensi kecil seperti ini membuat pembaca kode tidak perlu berhenti dan bertanya-tanya apakah kelalaian atau kesengajaan.

Rujukan resmi: cppreference: return statement dan cppreference: functions . Nilai kembalian kita serahkan melalui return, tetapi bagaimana dengan parameter — apakah fungsi menerima salinan nilai atau alat untuk mengubah data pemanggil? Itulah topik tiga Chapter berikutnya.