Menu
CoddyTech

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 InstanceAnggota Statis
Unik untuk setiap objectDigunakan bersama oleh semua object
Dibuat saat object dibuatSudah ada sebelum object apa pun dibuat
Diakses melalui object: player.healthDiakses melalui class: Player::playerCount

Member static berguna untuk penghitung, nilai konfigurasi, atau data apa pun yang secara logis menjadi milik class, bukan object individual.

challenge icon

Tantangan

Mudah

Mari 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 class Product yang mengelola setiap produk sekaligus melacak data seluruh inventaris. Class-mu harus memiliki:
    • Anggota instans: name (string) dan price (double), yang unik untuk setiap produk
    • Anggota statis totalProducts yang menghitung jumlah produk yang saat ini ada
    • Anggota statis totalValue yang 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>"
  • 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 Product di 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 Product lain dengan nama dan harga kedua. Cetak informasinya dan statistik inventaris.
    • Buat Product ketiga dengan nama "Bonus" dan harga 5.00. Cetak statistik inventaris akhir.

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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online