Penentu Akses secara Mendalam
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 35 dari 104.
Sekarang setelah kamu memahami tiga penentu akses, mari kita lihat perilakunya saat kamu memiliki beberapa object dari class yang sama. Kesalahpahaman yang umum adalah bahwa private berarti "hanya object ini", tetapi sebenarnya artinya "hanya class ini".
Object dari class yang sama dapat mengakses anggota private satu sama lain:
class Person {
std::string secret;
public:
Person(std::string s) : secret(s) {}
void readSecret(const Person& other) {
// Mengakses anggota privat milik object lain diperbolehkan!
std::cout << other.secret;
}
};Ini berfungsi karena kontrol akses diterapkan pada tingkat class, bukan tingkat object. Method readSecret merupakan bagian dari class Person, sehingga dapat mengakses anggota privat dari object Person mana pun. Desain ini memungkinkan operasi seperti konstruktor salinan dan operator perbandingan bekerja dengan status internal object lain.
Kamu juga bisa beralih antarpenentu akses beberapa kali di dalam class:
class Mixed {
public:
void publicMethod1();
private:
int privateData;
public:
void publicMethod2(); // Kembali ke public
private:
void privateHelper(); // Private lagi
};Walaupun ini valid dalam C++, umumnya lebih baik mengelompokkan anggota berdasarkan tingkat akses agar lebih mudah dibaca. Sebagian besar panduan gaya menyarankan untuk mencantumkan anggota public terlebih dahulu karena anggota tersebut membentuk antarmuka class, lalu anggota protected, kemudian private.
Tantangan
MudahMari buat sistem perbandingan dompet yang menunjukkan cara object dari class yang sama dapat mengakses anggota privat milik satu sama lain. Ini adalah wawasan penting tentang kontrol akses C++: kontrol ini diterapkan pada tingkat class, bukan tingkat object.
Kamu akan membuat dua file untuk mengatur kodemu:
Wallet.h: Definisikan classWalletyang menyimpan data keuangan privat, tetapi memungkinkan perbandingan antardompet. Class-mu harus memiliki:- Anggota privat:
ownerName(string) danbalance(double) - Konstruktor yang menerima nama pemilik dan saldo awal
- Getter publik
getOwnerName()yang mengembalikan nama pemilik - Method
hasMoreThan(const Wallet& other)yang membandingkan saldo dompet ini dengan saldo privat dompet lain, lalu mengembalikantruejika dompet ini memiliki uang lebih banyak - Method
combinedBalance(const Wallet& other)yang mengembalikan jumlah saldo privat kedua dompet - Method
transferTo(Wallet& other, double amount)yang memindahkan uang dari dompet ini ke dompet lain. Method ini harus mengubah saldo privat kedua dompet secara langsung, hanya jika jumlahnya positif dan tidak melebihi saldo dompet ini
- Anggota privat:
main.cpp: Tunjukkan akses anggota privat antar-object. Baca dua nama pemilik dan dua saldo dari input (empat baris: name1, balance1, name2, balance2), lalu:- Buat dua object
Walletdengan nilai input tersebut - Cetak
"Combined wealth: $<amount>"menggunakancombinedBalance() - Bandingkan kedua dompet dan cetak
"<name> has more money"untuk pemilik yang saldonya lebih tinggi, gunakanhasMoreThan()untuk menentukannya - Pindahkan
100.0dari dompet pertama ke dompet kedua menggunakantransferTo() - Cetak
"After transfer:" - Cetak lagi
"Combined wealth: $<amount>"(nilainya seharusnya tidak berubah) - Bandingkan lagi dan cetak
"<name> has more money"(hasilnya mungkin berubah)
- Buat dua object
Konsep penting di sini adalah method seperti hasMoreThan() dan transferTo() dapat mengakses langsung anggota balance yang privat dari object Wallet lain: getter tidak diperlukan. Ini berfungsi karena kontrol akses di C++ berbasis class: kode apa pun di dalam class Wallet dapat mengakses anggota privat milik object Wallet mana pun.
Format semua nilai uang dengan dua angka desimal menggunakan std::fixed dan std::setprecision(2) dari <iomanip>. Konversikan input saldo menggunakan std::stod().
Coba sendiri
#include <iostream>
#include <string>
#include <iomanip>
#include "Wallet.h"
using namespace std;
int main() {
// Baca input: name1, balance1, name2, balance2
string name1, name2;
string balanceStr1, balanceStr2;
getline(cin, name1);
getline(cin, balanceStr1);
getline(cin, name2);
getline(cin, balanceStr2);
double balance1 = stod(balanceStr1);
double balance2 = stod(balanceStr2);
// Atur format output untuk nilai uang
cout << fixed << setprecision(2);
// TODO: Buat dua object Wallet dengan nilai input
// TODO: Cetak total kekayaan menggunakan combinedBalance()
// Format: "Combined wealth: $<amount>"
// TODO: Bandingkan kedua dompet menggunakan hasMoreThan() dan cetak siapa yang memiliki lebih banyak uang
// Format: "<name> has more money"
// TODO: Transfer 100.0 dari dompet pertama ke dompet kedua menggunakan transferTo()
// TODO: Cetak "After transfer:"
// TODO: Cetak total kekayaan lagi
// TODO: Bandingkan lagi dan cetak siapa yang memiliki lebih banyak uang
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