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 kembalianFunction 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.
Tantangan
MudahMari 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 classFormatterdengan methodformat()yang di-overload untuk menangani berbagai skenario:- Method yang menerima satu
std::stringdan mencetak:Message: <text> - Method yang menerima
std::stringdan tingkat prioritasint, lalu mencetak:[Priority <priority>] <text> - Method yang menerima
std::stringdan timestampdouble, lalu mencetak:[<timestamp>s] <text> - Method yang menerima tiga parameter
std::string(pengirim, penerima, pesan) dan mencetak:From <sender> to <receiver>: <message>
format(): compiler akan memilih method yang tepat berdasarkan argumennya.- Method yang menerima satu
main.cpp: Baca empat input (masing-masing pada baris terpisah):- Teks pesan sederhana
- Tingkat prioritas (integer)
- Timestamp (double)
- Nama pengirim
Buat object
Formatterdan 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 readyPerhatikan 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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online