Anggota instance vs static
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 27 dari 104.
Sejauh ini, setiap variabel anggota yang kamu buat termasuk dalam object tertentu. Saat kamu membuat dua object Player, masing-masing memiliki name dan health sendiri. Ini disebut anggota instance: keberadaannya terpisah untuk setiap instance class.
Namun, bagaimana jika kamu membutuhkan data yang digunakan bersama oleh semua object? Misalnya, melacak jumlah total pemain.
Di sinilah member statis berperan. Member statis dimiliki oleh class itu sendiri, bukan oleh object tertentu.
class Player {
std::string name; // Anggota instans, setiap pemain memiliki miliknya sendiri
int health; // Anggota instans
static int playerCount; // Anggota statis, digunakan bersama oleh SEMUA pemain
public:
Player(std::string n) : name(n), health(100) {
playerCount++; // Tambah nilainya saat pemain baru dibuat
}
~Player() {
playerCount--; // Kurangi nilainya saat pemain dihancurkan
}
};Perbedaan utamanya: anggota instance diakses melalui object, sedangkan anggota static dapat diakses melalui nama class itu sendiri. Anggap anggota instance sebagai "satu untuk setiap object" dan anggota static sebagai "satu untuk setiap class."
| Anggota Instance | Anggota Statis |
|---|---|
| Unik untuk setiap object | Digunakan bersama oleh semua object |
| Dibuat saat object dibuat | Sudah ada sebelum object apa pun dibuat |
Diakses melalui object: player.health | Diakses melalui class: Player::playerCount |
Member static berguna untuk penghitung, nilai konfigurasi, atau data apa pun yang secara logis menjadi milik class, bukan object individual.
Tantangan
MudahMari buat sistem inventaris produk yang melacak detail setiap produk dan statistik inventaris secara keseluruhan menggunakan anggota instans dan statis.
Kamu akan membuat dua file untuk mengatur kodemu:
Product.h: Definisikan classProductyang mengelola setiap produk sekaligus melacak data seluruh inventaris. Class-mu harus memiliki:- Anggota instans:
name(string) danprice(double), yang unik untuk setiap produk - Anggota statis
totalProductsyang menghitung jumlah produk yang saat ini ada - Anggota statis
totalValueyang melacak harga gabungan semua produk - Konstruktor yang menerima nama dan harga, menginisialisasi anggota instans, serta memperbarui kedua penghitung statis (menambah jumlah, menambahkan harga ke nilai total)
- Destruktor yang memperbarui penghitung statis saat produk dihapus (mengurangi jumlah, mengurangi harga dari nilai total)
- method
getInfo()yang mengembalikan string dengan format:"<name>: $<price>" - method statis
getInventoryStats()yang mengembalikan string:"Products: <count>, Total Value: $<value>"
- Anggota instans:
main.cpp: Tunjukkan cara anggota statis digunakan bersama oleh semua object, sementara anggota instans tetap unik. Baca dua nama produk dan harganya dari input (name1, price1, name2, price2: masing-masing pada baris terpisah), lalu:- Cetak statistik inventaris awal menggunakan nama class:
Product::getInventoryStats() - Buat blok cakupan dengan kurung kurawal, lalu buat
Productdi dalamnya menggunakan nama dan harga pertama. Cetak informasinya dan statistik inventaris saat ini. - Setelah blok berakhir (produk pertama dihancurkan), cetak
"After first scope:"diikuti statistik inventaris - Buat
Productlain dengan nama dan harga kedua. Cetak informasinya dan statistik inventaris. - Buat
Productketiga dengan nama"Bonus"dan harga5.00. Cetak statistik inventaris akhir.
- Cetak statistik inventaris awal menggunakan nama class:
Ingat untuk mendefinisikan anggota statis di luar class dalam file header (setelah definisi class). Format harga dengan dua angka di belakang koma menggunakan std::fixed dan std::setprecision(2) dari <iomanip>.
Sertakan file header-mu di main.cpp menggunakan #include "Product.h".
Coba sendiri
#include <iostream>
#include <string>
#include "Product.h"
using namespace std;
int main() {
// Baca input
string name1;
double price1;
string name2;
double price2;
getline(cin, name1);
cin >> price1;
cin.ignore();
getline(cin, name2);
cin >> price2;
// TODO: Tampilkan statistik inventaris awal menggunakan Product::getInventoryStats()
// TODO: Buat blok cakupan dengan kurung kurawal
// Di dalam blok:
// - Buat Product dengan name1 dan price1
// - Tampilkan informasinya menggunakan getInfo()
// - Tampilkan statistik inventaris saat ini
// TODO: Setelah blok berakhir, tampilkan "After first scope:"
// Lalu tampilkan statistik inventaris
// TODO: Buat Product lain dengan name2 dan price2
// Tampilkan informasinya dan statistik inventaris
// TODO: Buat Product ketiga dengan nama "Bonus" dan harga 5.00
// Cetak statistik inventaris akhir
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