Menu
Coddy logo textTech

C++'da Erişim Belirleyiciler

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 34 / 104.

C++, sınıf üyelerine kimlerin erişebileceğini denetleyen üç erişim belirleyicisi sunar: public, protected ve private. Bunlar kapsüllemenin temelini oluşturur.

class Account {
public:
    std::string ownerName;      // Her yerden erişilebilir
    
protected:
    double interestRate;        // Bu sınıfta ve türetilmiş sınıflarda erişilebilir
    
private:
    double balance;             // Yalnızca bu sınıf içinde erişilebilir
};

Public üyelerine her yerden erişilebilir; sınıfın içinden, türetilmiş sınıflardan ve harici koddan. Private üyeler en kısıtlayıcı olanlardır ve yalnızca sınıfın kendisi içinden erişilebilir. Protected ise ikisinin arasındadır; dış dünya için private gibi davranır, ancak türetilmiş sınıflar bu üyelere erişebilir.

class Account {
private:
    double balance;
    
public:
    Account() : balance(0) {}
    
    void deposit(double amount) {
        balance += amount;    // OK - sınıfın içinde
    }
};

int main() {
    Account acc;
    acc.deposit(100);         // OK - deposit public
    // acc.balance = 500;     // ERROR - balance private
}

Varsayılan olarak, herhangi bir belirleyici verilmezse bir sınıftaki tüm üyeler özeldir. Bu, neyin dışarıya açılması gerektiğine açıkça karar vermenizi teşvik eder. Genel uygulama, veri üyelerini özel yapmak ve onlarla güvenli bir şekilde etkileşim kurmak için herkese açık yöntemler sağlamaktır.

challenge icon

Görev

Kolay

G erişim belirleyicilerinin kimin neye erişebileceğini nasıl kontrol ettiğini gösteren basit bir çalışan yönetim sistemi oluşturalım. Bazı verilerin tamamen private, bazılarının olası alt sınıflar tarafından erişilebilir ve bazılarının da herkes tarafından erişilebilir olduğu bir sınıf oluşturacaksın.

Kodunu düzenlemek için iki dosya oluşturacaksın:

  • Employee.h: Verileri uygun şekilde korumak için üç erişim belirleyicisinin tümünü kullanan bir Employee sınıfı tanımla:
    • Public: Çalışanın name değeri (string). Buna her yerden erişilebilir
    • Protected: Çalışanın department değeri (string): sınıf içinde ve türetilmiş sınıflar tarafından erişilebilir, ancak dışarıdan erişilemez
    • Private: Çalışanın salary değeri (double): yalnızca sınıfın kendisi içinde erişilebilir
    • Tüm üç üyeyi başlatmak için name, department ve salary alan bir kurucu
    • Private salary değerini döndüren bir public getSalary() metodu
    • Protected department değerini döndüren bir public getDepartment() metodu
    • Yalnızca amount pozitifse salary değerini verilen amount kadar artıran bir public giveRaise(double amount) metodu
    • Çalışanın bilgilerini şu biçimde yazdıran bir public displayInfo() metodu: "Name: <name>, Department: <department>, Salary: $<salary>"
  • main.cpp: Bir Employee nesnesiyle etkileşim kurarak erişim belirleyicilerinin nasıl çalıştığını göster. Bir çalışanın name, department ve salary bilgilerini girdiden (üç ayrı satır) oku, ardından:
    • Girdi değerleriyle bir Employee oluştur
    • Public üyeye erişerek çalışanın name değerini doğrudan yazdır: "Direct access - Name: <name>"
    • Getter kullanarak department değerini yazdır: "Via getter - Department: <department>"
    • Getter kullanarak salary değerini yazdır: "Via getter - Salary: $<salary>"
    • Çalışana 5000.0 tutarında zam yap
    • "After raise:" yazdır
    • Güncellenen bilgileri göstermek için displayInfo() metodunu çağır

Tüm salary değerlerini, std::fixed içindeki std::setprecision(2) ve <iomanip> kullanarak iki ondalık basamakla biçimlendir. Salary girdisini std::stod() kullanarak string'den double'a dönüştür.

Buradaki temel fikir şudur: name değerine main içinden doğrudan erişebilirken department veya salary değerlerine doğrudan erişemezsin. Public getter metotlarını kullanmalısın. Bu, kapsüllemenin uygulamadaki hâlidir: sınıf, verilerine nasıl erişileceğini ve verilerinin nasıl değiştirileceğini kontrol eder.

Kendin dene

#include <iostream>
#include <string>
#include <iomanip>
#include "Employee.h"

using namespace std;

int main() {
    // Girdiyi oku
    string name;
    string department;
    string salaryStr;
    
    getline(cin, name);
    getline(cin, department);
    getline(cin, salaryStr);
    double salary = stod(salaryStr);
    
    // Maaş çıktısı için hassasiyeti ayarla
    cout << fixed << setprecision(2);
    
    // TODO: Girdi değerleriyle bir Employee nesnesi oluştur
    
    // TODO: Çalışanın adını public üyeye doğrudan erişerek yazdır
    // Format: "Direct access - Name: <name>"
    
    // TODO: Departmanı getter metodunu kullanarak yazdır
    // Format: "Via getter - Department: <department>"
    
    // TODO: Maaşı getter metodunu kullanarak yazdır
    // Format: "Via getter - Salary: $<salary>"
    
    // TODO: Çalışana 5000.0 zam yap
    
    // TODO: "After raise:" yazdır
    
    // TODO: Güncellenmiş bilgileri göstermek için displayInfo() çağır
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C++ derleyicisi