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.
Görev
KolayG 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 birEmployeesınıfı tanımla:- Public: Çalışanın
namedeğeri (string). Buna her yerden erişilebilir - Protected: Çalışanın
departmentdeğ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
salarydeğ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>"
- Public: Çalışanın
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
Employeeoluş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.0tutarında zam yap "After raise:"yazdır- Güncellenen bilgileri göstermek için
displayInfo()metodunu çağır
- Girdi değerleriyle bir
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;
}
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
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic KonteynerKendi başına pratik yap: Online C++ derleyicisi