Menu
CoddyTech

Overloading Fungsi

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 57 dari 104.

Function overloading memungkinkan kamu mendefinisikan beberapa fungsi dengan nama yang sama, tetapi daftar parameternya berbeda. Compiler memilih versi yang tepat berdasarkan argumen yang kamu berikan. Ini adalah salah satu bentuk utama polimorfisme saat kompilasi.

Agar overloading berfungsi, signature fungsi harus berbeda, yaitu dalam jumlah parameternya, tipenya, atau keduanya:

class Calculator {
public:
    int add(int a, int b) {
        return a + b;
    }
    
    double add(double a, double b) {
        return a + b;
    }
    
    int add(int a, int b, int c) {
        return a + b + c;
    }
};

Calculator calc;
calc.add(5, 3);        // Memanggil add(int, int)
calc.add(2.5, 3.7);    // Memanggil add(double, double)
calc.add(1, 2, 3);     // Memanggil add(int, int, int)

Compiler memeriksa setiap pemanggilan dan mencocokkannya dengan overload yang sesuai. Proses ini terjadi sepenuhnya saat kompilasi, jadi tidak ada overhead saat runtime.

Penting: Tipe kembalian saja tidak membedakan fungsi yang dioverload. Hal berikut akan menyebabkan error compiler:

int getValue();
double getValue();  // error: tidak bisa melakukan overload hanya berdasarkan tipe kembalian

Function overloading membuat kodemu lebih intuitif. Alih-alih membuat nama terpisah seperti addInts, addDoubles, dan addThreeInts, kamu menggunakan satu nama yang bermakna dan membiarkan compiler menangani sisanya.

challenge icon

Tantangan

Mudah

Mari kita buat class pemformat pesan yang menunjukkan keunggulan overloading fungsi. Kamu akan membuat class Formatter dengan beberapa method format() yang menangani berbagai jenis input, sehingga compiler dapat memilih versi yang tepat berdasarkan nilai yang kamu berikan.

Kamu akan menyusun kodemu dalam dua file:

  • Formatter.h: Definisikan class Formatter dengan method format() yang di-overload untuk menangani berbagai skenario:
    • Method yang menerima satu std::string dan mencetak: Message: <text>
    • Method yang menerima std::string dan tingkat prioritas int, lalu mencetak: [Priority <priority>] <text>
    • Method yang menerima std::string dan timestamp double, lalu mencetak: [<timestamp>s] <text>
    • Method yang menerima tiga parameter std::string (pengirim, penerima, pesan) dan mencetak: From <sender> to <receiver>: <message>
    Semua method harus diberi nama format(): compiler akan memilih method yang tepat berdasarkan argumennya.
  • main.cpp: Baca empat input (masing-masing pada baris terpisah):
    1. Teks pesan sederhana
    2. Tingkat prioritas (integer)
    3. Timestamp (double)
    4. Nama pengirim

    Buat object Formatter dan tunjukkan penggunaan keempat method yang di-overload:

    • Panggil format() hanya dengan teks pesan
    • Panggil format() dengan teks pesan dan prioritas
    • Panggil format() dengan teks pesan dan timestamp
    • Panggil format() dengan pengirim, "Admin" sebagai penerima, dan teks pesan

Contohnya, dengan input System ready, 3, 12.5, dan Server:

Message: System ready
[Priority 3] System ready
[12.5s] System ready
From Server to Admin: System ready

Perhatikan bahwa kamu memanggil nama method yang sama, format(), sebanyak empat kali, tetapi setiap pemanggilan menjalankan versi yang berbeda berdasarkan jenis dan jumlah argumen. Inilah polimorfisme saat kompilasi: compiler menentukan overload yang akan digunakan sebelum program dijalankan.

Coba sendiri

#include <iostream>
#include <string>
#include "Formatter.h"

using namespace std;

int main() {
    // Baca input
    string message;
    getline(cin, message);
    
    int priority;
    cin >> priority;
    
    double timestamp;
    cin >> timestamp;
    cin.ignore();
    
    string sender;
    getline(cin, sender);
    
    // TODO: Buat object Formatter
    
    // TODO: Panggil format() hanya dengan teks pesan
    
    // TODO: Panggil format() dengan teks pesan dan priority
    
    // TODO: Panggil format() dengan teks pesan dan timestamp
    
    // TODO: Panggil format() dengan sender, "Admin" sebagai penerima, dan teks pesan
    
    return 0;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online