Overloading Operator [] dan ()
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 45 dari 104.
Operator subskrip ([]) memungkinkan class-mu berperilaku seperti array, sehingga elemen dapat diakses berdasarkan indeks. Operator pemanggilan fungsi (()) mengubah object menjadi entitas yang dapat dipanggil, yang dikenal sebagai functor.
Berikut wrapper array sederhana dengan operator subscript:
class IntArray {
int* data;
size_t size;
public:
IntArray(size_t s) : size(s), data(new int[s]()) {}
~IntArray() { delete[] data; }
int& operator[](size_t index) {
return data[index];
}
const int& operator[](size_t index) const {
return data[index];
}
};Perhatikan, kami menyediakan dua versi: satu mengembalikan referensi non-const (sehingga nilainya bisa diubah), dan versi const berfungsi dengan object const. Dengan begitu, kamu bisa menulis arr[0] = 5; untuk membaca dan menulis.
Operator pemanggilan fungsi membuat object yang bisa "dipanggil" seperti fungsi:
class Multiplier {
int factor;
public:
Multiplier(int f) : factor(f) {}
int operator()(int value) const {
return value * factor;
}
};
Multiplier triple(3);
int result = triple(10); // Mengembalikan 30Functor sangat berguna karena dapat mempertahankan state di antara pemanggilan, tidak seperti fungsi biasa. Functor umum digunakan dengan algoritma STL saat kamu membutuhkan perilaku yang dapat disesuaikan dan mengingat nilai konfigurasi.
Tantangan
MudahMari buat class ScoreTracker yang menggabungkan operator subskrip dan operator pemanggilan fungsi. class ini akan menyimpan skor pemain dan memungkinkan kamu mengaksesnya berdasarkan indeks menggunakan [], sekaligus bertindak sebagai functor yang menerapkan pengali bonus pada skor apa pun yang kamu berikan kepadanya.
Kamu akan membuat dua file untuk mengatur kodemu:
ScoreTracker.h: Definisikan classScoreTrackeryang mengelola array skor pemain dan dapat menerapkan bonus. class-mu harus memiliki:- Array
int*yang dialokasikan secara dinamis untuk menyimpan skor - Anggota
size_tuntuk jumlah skor - Anggota
doubleuntuk pengali bonus - Konstruktor yang menerima ukuran dan pengali bonus, lalu menginisialisasi semua skor ke 0
- Destruktor yang membersihkan memori dinamis dengan benar
- Operator subskrip
[](versi const dan non-const) untuk mengakses skor berdasarkan indeks - Operator pemanggilan fungsi
()yang menerima skorintdan mengembalikan skor yang dikalikan dengan pengali bonus (sebagaiint) - method
getSize()yang mengembalikan jumlah skor
Operator subskrip non-const mengembalikan referensi sehingga kamu dapat menulis
tracker[0] = 100;. Versi const memungkinkan akses hanya-baca untuk object const. Operator pemanggilan fungsi harus ditandaiconstkarena tidak mengubah keadaan object.- Array
main.cpp: Baca input berikut (masing-masing pada baris terpisah):- Jumlah pemain (ukuran)
- Pengali bonus (sebagai double)
- Skor setiap pemain (satu per baris, sebanyak jumlah pemain)
- Skor uji untuk diterapkan bonus
Buat
ScoreTracker, gunakan operator subskrip untuk menyimpan skor setiap pemain, lalu tampilkan semua skor. Terakhir, gunakan operator pemanggilan fungsi untuk menghitung skor setelah bonus diterapkan.Format output:
Player 0: <score> Player 1: <score> ... Bonus applied to <test_score>: <result>
Contohnya, dengan 3 pemain, pengali 1.5, skor 100, 200, 150, dan skor uji 80:
Player 0: 100
Player 1: 200
Player 2: 150
Bonus applied to 80: 120Gunakan std::stoi() dan std::stod() untuk konversi input. Jangan lupa header guards di file header-mu.
Coba sendiri
#include <iostream>
#include <string>
#include "ScoreTracker.h"
using namespace std;
// TODO: Implementasikan konstruktor ScoreTracker
ScoreTracker::ScoreTracker(size_t size, double multiplier) {
// TODO: Inisialisasi anggota dan alokasikan array dinamis
// Inisialisasi semua skor ke 0
}
// TODO: Implementasikan destruktor ScoreTracker
ScoreTracker::~ScoreTracker() {
// TODO: Bebaskan memori dinamis
}
// TODO: Implementasikan operator subskrip non-const
// TODO: Implementasikan operator subskrip const
// TODO: Implementasikan operator pemanggilan fungsi
// TODO: Implementasikan method getSize
size_t ScoreTracker::getSize() const {
// TODO: Kembalikan jumlah skor
}
int main() {
string line;
// Baca jumlah pemain
getline(cin, line);
size_t numPlayers = stoi(line);
// Baca pengali bonus
getline(cin, line);
double multiplier = stod(line);
// TODO: Buat ScoreTracker dengan numPlayers dan multiplier
// TODO: Baca skor setiap pemain dan simpan menggunakan operator subskrip
// TODO: Baca skor uji
// TODO: Tampilkan skor semua pemain dalam format: "Player X: <score>"
// TODO: Tampilkan hasil setelah bonus diterapkan dalam format: "Bonus applied to <test_score>: <result>"
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