Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class Wallet yang menyimpan data keuangan privat, tetapi memungkinkan perbandingan antardompet. Class-mu harus memiliki:
    • Anggota privat: ownerName (string) dan balance (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 mengembalikan true jika 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
  • 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 Wallet dengan nilai input tersebut
    • Cetak "Combined wealth: $<amount>" menggunakan combinedBalance()
    • Bandingkan kedua dompet dan cetak "<name> has more money" untuk pemilik yang saldonya lebih tinggi, gunakan hasMoreThan() untuk menentukannya
    • Pindahkan 100.0 dari dompet pertama ke dompet kedua menggunakan transferTo()
    • Cetak "After transfer:"
    • Cetak lagi "Combined wealth: $<amount>" (nilainya seharusnya tidak berubah)
    • Bandingkan lagi dan cetak "<name> has more money" (hasilnya mungkin berubah)

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;
}
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