Overloading Operator Perbandingan
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 42 dari 104.
Operator perbandingan seperti ==, !=, <, >, <=, dan >= memungkinkan kamu membandingkan object dari class kustommu. Operator ini mengembalikan bool dan sebaiknya ditandai dengan const karena tidak mengubah kedua operand.
class Date {
int year, month, day;
public:
Date(int y, int m, int d) : year(y), month(m), day(d) {}
bool operator==(const Date& other) const {
return year == other.year &&
month == other.month &&
day == other.day;
}
bool operator<(const Date& other) const {
if (year != other.year) return year < other.year;
if (month != other.month) return month < other.month;
return day < other.day;
}
};Teknik yang berguna adalah mengimplementasikan operator perbandingan lainnya dengan operator yang sudah kamu definisikan. Setelah memiliki == dan <, operator lainnya dapat dibuat dengan mudah:
bool operator!=(const Date& other) const {
return !(*this == other);
}
bool operator>(const Date& other) const {
return other < *this;
}
bool operator<=(const Date& other) const {
return !(other < *this);
}
bool operator>=(const Date& other) const {
return !(*this < other);
}Pendekatan ini mengurangi duplikasi kode dan memastikan semua operator perbandinganmu berperilaku konsisten. Jika nanti kamu mengubah cara kerja kesetaraan atau kurang dari, operator lainnya akan tetap selaras secara otomatis.
Tantangan
MudahMari buat class Version yang merepresentasikan nomor versi perangkat lunak (seperti 2.1.0 atau 3.0.5) dan mendukung keenam operator perbandingan. Ini adalah kasus penggunaan praktis, yaitu membandingkan versi untuk menentukan perangkat lunak mana yang lebih baru. Cocok untuk berlatih melakukan overloading operator perbandingan.
Kamu akan membuat dua file untuk mengatur kodemu:
Version.h: Definisikan classVersionyang menyimpan tiga bilangan bulat untuk mewakili nomor versi major, minor, dan patch. Class-mu harus mendukung:- Constructor yang menerima nilai major, minor, dan patch
- Getter untuk setiap komponen:
getMajor(),getMinor(),getPatch()(semuanya const) - Keenam operator perbandingan:
==,!=,<,>,<=,>= - Method
toString()yang mengembalikan versi sebagai string dengan format"major.minor.patch"
Implementasikan
==dan<secara langsung, lalu definisikan empat operator lainnya berdasarkan kedua operator tersebut. Untuk perbandingan kurang dari, bandingkan major terlebih dahulu, lalu minor jika major sama, kemudian patch jika major dan minor sama. Semua operator perbandingan harus berupa fungsi anggota const.main.cpp: Baca enam bilangan bulat dari input yang mewakili dua versi (major1, minor1, patch1, major2, minor2, patch2, masing-masing pada baris terpisah). Buat dua objectVersiondan bandingkan keduanya menggunakan semua operator yang kamu buat.Format output:
Version 1: <v1> Version 2: <v2> v1 == v2: <true/false> v1 != v2: <true/false> v1 < v2: <true/false> v1 > v2: <true/false> v1 <= v2: <true/false> v1 >= v2: <true/false>Cetak
trueataufalse(huruf kecil) untuk setiap hasil perbandingan.
Teknik utamanya adalah mengimplementasikan empat operator turunan (!=, >, <=, >=) hanya menggunakan == dan <. Cara ini mengurangi duplikasi kode dan memastikan semua operator tetap konsisten jika kamu mengubah logika perbandingan.
Ubah string input menjadi bilangan bulat menggunakan std::stoi(). Gunakan std::to_string() untuk menyusun string versi. Jangan lupa menambahkan header guard di file header-mu.
Coba sendiri
#include <iostream>
#include <string>
#include "Version.h"
using namespace std;
int main() {
// Baca enam bilangan bulat untuk dua versi
string line;
getline(cin, line);
int major1 = stoi(line);
getline(cin, line);
int minor1 = stoi(line);
getline(cin, line);
int patch1 = stoi(line);
getline(cin, line);
int major2 = stoi(line);
getline(cin, line);
int minor2 = stoi(line);
getline(cin, line);
int patch2 = stoi(line);
// TODO: Buat dua object Version
// TODO: Tampilkan Version 1 dan Version 2 menggunakan toString()
// TODO: Bandingkan menggunakan keenam operator dan tampilkan hasilnya
// Gunakan "true" atau "false" (huruf kecil) untuk setiap perbandingan
// Format: "v1 == v2: true" atau "v1 == v2: false"
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