Kuis
Kuis 1 — Perbaiki Program
#include <iostream>
struct Date{
int year, month, day;
Date(int _year, int _month, int _day){
year=_year; month=_month; day=_day;
}
void print(){
std::cout << year << '/' << month << '/' << day;
}
};
void doSomething(const Date &date)
{
date.print();
}
int main()
{
Date today(2020, 10, 14);
today.print();
doSomething(today);
return 0;
}
Analisis masalah
doSomething menerima const Date&, tetapi memanggil date.print().
Versi print() yang tersedia bukan fungsi const, sehingga tidak dapat dipanggil pada objek const (atau referensi const). Inilah yang memicu error.
Inti perbaikan (konsep)
- Tandai void print() const agar menjamin tidak memodifikasi objek, sehingga bisa dipanggil pada referensi const.
- (Opsional) tambahkan pemformatan akhir baris saat mencetak.
Catatan: Di sini kita tidak mengubah kode asli—ini hanya penjelasan mengapa gagal dan bagaimana seharusnya diperbaiki.
Kuis 2 — Output Apa?
#include <iostream>
struct Something{
void print(){
std::cout << "non-const\n";
}
void print() const {
std::cout << "const\n";
}
};
int main()
{
Something s1{};
s1.print();
const Something s2{};
s2.print();
return 0;
}
Analisis & Jawaban
s1adalah objeknon-const→ memanggiloverload void print()→ mencetaknon-const.s2adalah objekconst→ hanya boleh memanggilvoid print() const→ mencetakconst.
Output yang dihasilkan (urutannya)
non-const
const
Pelajaran utama
- Overloading berdasarkan const-ness pada fungsi anggota membuat pemanggilan otomatis memilih versi yang sesuai dengan const-ness objek.
- Fungsi bertanda const dapat dipanggil oleh objek const maupun non-const, sementara fungsi non-const tidak dapat dipanggil pada objek const.