Penentu Akses dalam C++
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 34 dari 104.
C++ menyediakan tiga penentu akses yang mengatur siapa yang dapat mengakses anggota class: public, protected, dan private. Ketiganya menjadi dasar enkapsulasi.
class Account {
public:
std::string ownerName; // Dapat diakses dari mana saja
protected:
double interestRate; // Dapat diakses di class ini dan class turunannya
private:
double balance; // Hanya dapat diakses di dalam class ini
};Anggota Public dapat diakses dari mana saja, di dalam class, dari class turunan, dan dari kode eksternal. Anggota Private paling membatasi, hanya dapat diakses di dalam class itu sendiri. Protected berada di antara keduanya. Aksesnya seperti private dari luar, tetapi class turunan dapat mengakses anggota ini.
class Account {
private:
double balance;
public:
Account() : balance(0) {}
void deposit(double amount) {
balance += amount; // OK, di dalam class
}
};
int main() {
Account acc;
acc.deposit(100); // OK, deposit bersifat public
// acc.balance = 500; // ERROR, balance bersifat private
}Secara default, semua member dalam class bersifat private jika tidak ada penentu yang diberikan. Ini mendorong kamu untuk menentukan secara eksplisit apa yang seharusnya diekspos. Praktik umum adalah menjadikan member data bersifat private dan menyediakan method publik untuk berinteraksi dengannya secara aman.
Tantangan
MudahMari kita buat sistem manajemen karyawan sederhana untuk menunjukkan cara penentu akses mengatur siapa yang dapat mengakses apa. Kamu akan membuat class dengan sebagian data yang sepenuhnya private, sebagian dapat diakses oleh subclass potensial, dan sebagian terbuka untuk semua orang.
Kamu akan membuat dua file untuk mengatur kodemu:
Employee.h: Definisikan classEmployeeyang menggunakan ketiga penentu akses untuk melindungi data dengan tepat:- Public:
name(string) milik karyawan. Ini dapat diakses dari mana saja - Protected:
department(string) milik karyawan: dapat diakses di dalam class dan oleh derived class, tetapi tidak dari luar - Private:
salary(double) milik karyawan: hanya dapat diakses di dalam class itu sendiri - Sebuah constructor yang menerima name, department, dan salary untuk menginisialisasi ketiga anggota
- Method public
getSalary()yang mengembalikan nilai salary private - Method public
getDepartment()yang mengembalikan nilai department protected - Method public
giveRaise(double amount)yang menaikkan salary sebesar jumlah yang diberikan, hanya jika jumlahnya positif - Method public
displayInfo()yang mencetak informasi karyawan dalam format:"Name: <name>, Department: <department>, Salary: $<salary>"
- Public:
main.cpp: Tunjukkan cara kerja penentu akses dengan berinteraksi dengan object Employee. Baca name, department, dan salary karyawan dari input (tiga baris terpisah), lalu:- Buat
Employeedengan nilai input - Cetak name karyawan secara langsung dengan mengakses anggota public:
"Direct access - Name: <name>" - Cetak department menggunakan getter:
"Via getter - Department: <department>" - Cetak salary menggunakan getter:
"Via getter - Salary: $<salary>" - Berikan kenaikan salary sebesar
5000.0kepada karyawan - Cetak
"After raise:" - Panggil
displayInfo()untuk menampilkan informasi yang telah diperbarui
- Buat
Format semua nilai salary dengan dua angka desimal menggunakan std::fixed dan std::setprecision(2) dari <iomanip>. Ubah input salary dari string menjadi double menggunakan std::stod().
Hal penting yang perlu dipahami adalah meskipun kamu dapat mengakses name secara langsung dari main, kamu tidak dapat mengakses department atau salary secara langsung. Kamu harus menggunakan method getter public. Inilah enkapsulasi dalam praktik: class mengatur cara datanya diakses dan diubah.
Coba sendiri
#include <iostream>
#include <string>
#include <iomanip>
#include "Employee.h"
using namespace std;
int main() {
// Baca input
string name;
string department;
string salaryStr;
getline(cin, name);
getline(cin, department);
getline(cin, salaryStr);
double salary = stod(salaryStr);
// Atur presisi output gaji
cout << fixed << setprecision(2);
// TODO: Buat object Employee dengan nilai input
// TODO: Cetak nama karyawan dengan mengakses anggota public secara langsung
// Format: "Direct access - Name: <name>"
// TODO: Cetak departemen menggunakan method getter
// Format: "Via getter - Department: <department>"
// TODO: Cetak gaji menggunakan method getter
// Format: "Via getter - Salary: $<salary>"
// TODO: Beri karyawan kenaikan gaji sebesar 5000.0
// TODO: Cetak "After raise:"
// TODO: Panggil displayInfo() untuk menampilkan informasi terbaru
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