Method dan variabel static
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 31 dari 104.
Kamu sudah mempelajari bahwa member static digunakan bersama oleh semua object. Sekarang, mari kita pelajari cara mendefinisikan dan menggunakan method static dengan benar bersama variabel static.
Variabel statis yang dideklarasikan di dalam class harus didefinisikan di luar class, biasanya di dalam file sumber. Ini karena anggota statis membutuhkan tepat satu lokasi penyimpanan yang digunakan bersama oleh semua object:
class Counter {
static int count; // Hanya deklarasi
public:
Counter() { count++; }
~Counter() { count--; }
static int getCount() { // method statis
return count;
}
};
// Definisi harus berada di luar class
int Counter::count = 0;static method dimiliki oleh class, bukan oleh object mana pun. Hal ini memiliki konsekuensi penting: static method tidak dapat mengakses member instance atau menggunakan pointer this, karena static method tidak dipanggil pada object tertentu.
class MathUtils {
static double pi;
public:
static double circleArea(double radius) {
return pi * radius * radius; // Dapat mengakses anggota statis
}
};
double MathUtils::pi = 3.14159;
// Dipanggil tanpa object
double area = MathUtils::circleArea(5.0);method static cocok untuk fungsi utilitas yang tidak memerlukan state object, method factory yang membuat object, atau untuk mengakses data statis. Karena tidak memerlukan instance object, kamu memanggilnya menggunakan nama class dan operator resolusi cakupan: ClassName::methodName().
Tantangan
MudahMari kita buat sistem pembuat ID unik yang menunjukkan cara method dan variabel statis bekerja sama untuk menyediakan fungsi pada tingkat class tanpa memerlukan instance object.
Kamu akan membuat dua file untuk mengatur kodemu:
IDGenerator.h: Definisikan classIDGeneratoryang membuat ID unik berurutan. Class-mu harus memiliki:- Member statis privat
nextIdyang melacak ID berikutnya yang akan ditetapkan (dimulai dari1000) - Member statis privat
prefix(string) yang menyimpan awalan yang dapat disesuaikan untuk semua ID - Method statis
setPrefix(const std::string& p)yang mengubah awalan - Method statis
getNextId()yang mengembalikan string gabungan awalan dan nomor ID saat ini, lalu menaikkannextIduntuk pemanggilan berikutnya - Method statis
peekNextId()yang mengembalikan ID berikutnya tanpa menaikkan penghitung - Method statis
getGeneratedCount()yang mengembalikan jumlah ID yang telah dibuat (petunjuk: hitung berdasarkan nilai awal dannextIdsaat ini) - Method statis
reset()yang mengatur ulangnextIdke1000
Ingat untuk mendefinisikan member statismu di luar class setelah definisi class. Inisialisasi
prefixdengan"ID-".- Member statis privat
main.cpp: Tunjukkan cara memanggil method statis menggunakan nama class tanpa membuat object. Baca awalan khusus dari input, lalu:- Cetak
"Peek: <peeked_id>"menggunakanpeekNextId() - Buat tiga ID menggunakan
getNextId()dan cetak masing-masing sebagai"Generated: <id>" - Cetak
"Count: <count>"untuk menunjukkan jumlah ID yang telah dibuat - Ubah awalan menggunakan nilai input dengan
setPrefix() - Buat dua ID lagi dan cetak masing-masing sebagai
"Generated: <id>" - Cetak lagi
"Count: <count>" - Panggil
reset() - Cetak
"After reset - Peek: <peeked_id>" - Cetak
"After reset - Count: <count>"
- Cetak
Perhatikan bahwa kamu tidak pernah membuat object IDGenerator: semua method dipanggil langsung pada class menggunakan IDGenerator::methodName(). Inilah karakteristik utama method statis: method tersebut dimiliki oleh class itu sendiri, bukan oleh instance tertentu.
Sertakan <string> dan <iostream> di file header-mu, dan jangan lupa header guard.
Coba sendiri
#include <iostream>
#include <string>
#include "IDGenerator.h"
using namespace std;
int main() {
// Baca prefix khusus dari input
string customPrefix;
cin >> customPrefix;
// TODO: Cetak "Peek: <peeked_id>" menggunakan peekNextId()
// TODO: Buat tiga ID menggunakan getNextId() dan cetak masing-masing sebagai "Generated: <id>"
// TODO: Cetak "Count: <count>" untuk menunjukkan jumlah ID yang telah dibuat
// TODO: Ubah prefix menggunakan nilai input dengan setPrefix()
// TODO: Buat dua ID lagi dan cetak masing-masing sebagai "Generated: <id>"
// TODO: Cetak "Count: <count>" lagi
// TODO: Panggil reset()
// TODO: Cetak "After reset - Peek: <peeked_id>"
// TODO: Cetak "After reset - Count: <count>"
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