Overloading Operator Aritmetika
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 41 dari 104.
Operator aritmetika seperti +, -, *, dan / biasanya di-overload agar class kustom berperilaku seperti tipe numerik bawaan. Operator ini biasanya mengembalikan object baru, bukan mengubah operand.
Berikut adalah class Fraction dengan operator aritmetika:
class Fraction {
int numerator, denominator;
public:
Fraction(int n, int d) : numerator(n), denominator(d) {}
Fraction operator+(const Fraction& other) const {
return Fraction(
numerator * other.denominator + other.numerator * denominator,
denominator * other.denominator
);
}
Fraction operator*(const Fraction& other) const {
return Fraction(numerator * other.numerator,
denominator * other.denominator);
}
};Perhatikan bahwa kedua operator ditandai sebagai const karena tidak mengubah kedua operand. Keduanya membuat dan mengembalikan Fraction baru yang berisi hasilnya.
Untuk operator penugasan gabungan seperti +=, polanya berbeda. Operator ini mengubah operand kiri dan mengembalikan referensi ke operand tersebut:
Fraction& operator+=(const Fraction& other) {
numerator = numerator * other.denominator + other.numerator * denominator;
denominator = denominator * other.denominator;
return *this;
}Praktik yang umum adalah mengimplementasikan operator dasar menggunakan penugasan gabungan, sehingga mengurangi duplikasi kode:
Fraction operator+(const Fraction& other) const {
Fraction result = *this; // Salin object ini
result += other; // Gunakan penugasan gabungan
return result;
}Pendekatan ini memastikan kedua operator tetap konsisten dan memudahkan pemeliharaan.
Tantangan
MudahMari buat class Money yang menangani perhitungan mata uang menggunakan overloading operator aritmetika. Kamu akan mengimplementasikan beberapa operator aritmetika yang memungkinkanmu mengolah nilai uang senatural saat mengolah angka biasa.
Kamu akan membuat dua file untuk mengatur kodemu:
Money.h: Definisikan classMoneyyang menyimpan jumlah dalam sen (sebagaiint) untuk menghindari masalah presisi floating-point. Class-mu harus mendukung:- Konstruktor yang menerima dolar dan sen sebagai bilangan bulat terpisah
- Getter
getDollars()yang mengembalikan bagian dolar - Getter
getCents()yang mengembalikan bagian sen (0-99) - Operator
+dan-yang di-overload dan mengembalikan objectMoneybaru - Operator penugasan gabungan
+=dan-=yang di-overload, mengubah object saat ini, lalu mengembalikan referensi ke object tersebut - Method
display()yang mencetak uang dalam format$X.YY(selalu dua digit untuk sen)
Implementasikan operator dasar (
+dan-) menggunakan operator penugasan gabungan untuk mengurangi duplikasi kode, seperti yang ditunjukkan dalam pelajaran. Tandai semua operator aritmetika denganconstjika sesuai.main.cpp: Baca empat bilangan bulat dari input yang mewakili dua jumlah uang (dollars1, cents1, dollars2, cents2 pada baris terpisah). Buat dua objectMoney, lalu tunjukkan penggunaan semua operator:- Cetak
"Amount 1: "diikuti jumlah pertama yang ditampilkan - Cetak
"Amount 2: "diikuti jumlah kedua yang ditampilkan - Jumlahkan kedua nilai tersebut dan cetak
"Sum: "diikuti hasilnya - Kurangi jumlah kedua dari jumlah pertama dan cetak
"Difference: "diikuti hasilnya - Gunakan
+=untuk menambahkan jumlah kedua ke jumlah pertama, lalu cetak"After +=: "diikuti jumlah pertama yang sudah diubah
- Cetak
Untuk method display(), gunakan std::setw(2) dan std::setfill('0') dari <iomanip> untuk memastikan sen selalu ditampilkan dengan dua digit (misalnya, $5.07, bukan $5.7).
Ubah string input menjadi bilangan bulat menggunakan std::stoi(). Jangan lupa menambahkan header guard di file header-mu.
Coba sendiri
#include <iostream>
#include <string>
#include "Money.h"
using namespace std;
int main() {
// Baca input untuk dua jumlah uang
string line;
getline(cin, line);
int dollars1 = stoi(line);
getline(cin, line);
int cents1 = stoi(line);
getline(cin, line);
int dollars2 = stoi(line);
getline(cin, line);
int cents2 = stoi(line);
// TODO: Buat dua object Money dengan nilai input
// TODO: Tampilkan "Amount 1: " diikuti jumlah uang pertama
// TODO: Tampilkan "Amount 2: " diikuti jumlah uang kedua
// TODO: Jumlahkan kedua jumlah uang, lalu tampilkan "Sum: " diikuti hasilnya
// TODO: Kurangi jumlah uang pertama dengan jumlah uang kedua, lalu tampilkan "Difference: " diikuti hasilnya
// TODO: Gunakan += untuk menambahkan jumlah uang kedua ke jumlah uang pertama, lalu tampilkan "After +=: " diikuti jumlah uang pertama yang telah berubah
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