C++'ta Sınıflara (Class) Giriş
C++’ta class kavramını öğrenin. Sınıf tanımlama, nesne oluşturma, üyeler ve nesne yönelimli programlamanın temelleri örneklerle anlatılıyor.
Nesne yönelimli programlamanın (OOP) en temel yapı taşı sınıflar (class)’tır. C++’ta sınıflar, verileri (özellikler) ve bu verilere ait davranışları (metotlar) tek bir çatı altında toplar. Bu makalede sınıf tanımlama, nesne oluşturma, özelliklere erişim ve birbiriyle ilişkili sınıflar oluşturmayı öğreneceğiz.
1. Sınıf (Class) Nedir?
Sınıf, bir kavramın veya varlığın soyut bir modelidir. Gerçek dünyadaki bir nesnenin program içindeki temsili olarak düşünülebilir. Örneğin, bir “Kitap” nesnesi yazar, yayınevi, sayfa sayısı gibi özelliklere sahiptir.
C++’ta bir sınıf şu şekilde tanımlanır:
class SınıfAdı {
public:
// Özellikler (fields)
// Metotlar (functions)
};
2. Book Sınıfı: Basit Bir Örnek
Aşağıdaki örnekte bir Book sınıfı tanımlanmıştır. Bu sınıf bir kitabın temel özelliklerini ve davranışlarını içerir.
#include <iostream>
#include <string>
using namespace std;
class Book {
private:
string title;
string author;
int pageCount;
double price;
bool available;
public:
// Constructor (kurucu)
Book(string t, string a, int p, double pr, bool av)
: title(t), author(a), pageCount(p), price(pr), available(av) {}
// Getter ve Setter metotları
string GetTitle() const { return title; }
void SetTitle(string t) { title = t; }
string GetAuthor() const { return author; }
void SetAuthor(string a) { author = a; }
int GetPageCount() const { return pageCount; }
void DisplayInfo() const {
cout << "Kitap: " << title << endl;
cout << "Yazar: " << author << endl;
cout << "Sayfa: " << pageCount << endl;
cout << "Fiyat: " << price << " TL" << endl;
cout << (available ? "Stokta var" : "Stokta yok") << endl;
}
};
private üyeler sadece sınıf içinden erişilebilir.
Bu özellik encapsulation (kapsülleme) olarak adlandırılır.
public metotlar ise sınıf dışından çağrılabilir.
3. Book Sınıfının Kullanımı
Tanımlanan sınıf artık bir veri türü gibi kullanılabilir.
Book türünden nesneler oluşturabilir ve metotlarını çağırabiliriz.
int main() {
Book b1("C++ Programlama", "Bjarne Stroustrup", 1350, 240.0, true);
b1.DisplayInfo();
b1.SetTitle("Modern C++ Programlama");
cout << "\\nYeni Başlık: " << b1.GetTitle() << endl;
return 0;
}
Çıktı:
Kitap: C++ Programlama
Yazar: Bjarne Stroustrup
Sayfa: 1350
Fiyat: 240 TL
Stokta var
Yeni Başlık: Modern C++ Programlama
4. Birbiriyle İlişkili Sınıflar: Author ve Publisher
Gerçek dünyada bir kitabın yalnızca başlığı değil, bir yazarı ve yayınevi de vardır. Bu durumda Book sınıfının içinde diğer sınıfları composition (bileşim) yoluyla kullanabiliriz.
class Author {
private:
string name;
string country;
public:
Author(string n, string c) : name(n), country(c) {}
string GetInfo() const { return name + " (" + country + ")"; }
};
class Publisher {
private:
string name;
string city;
public:
Publisher(string n, string c) : name(n), city(c) {}
string GetInfo() const { return name + " - " + city; }
};
class Book {
private:
string title;
Author author;
Publisher publisher;
int pageCount;
public:
Book(string t, Author a, Publisher p, int pages)
: title(t), author(a), publisher(p), pageCount(pages) {}
void DisplayInfo() const {
cout << "Kitap: " << title << endl;
cout << "Yazar: " << author.GetInfo() << endl;
cout << "Yayınevi: " << publisher.GetInfo() << endl;
cout << "Sayfa Sayısı: " << pageCount << endl;
}
};
Burada Book sınıfı hem Author hem Publisher sınıflarını içerir.
Yani “Kitap bir Yazar ve bir Yayınevine sahiptir.” — bu bir has-a (sahiplik) ilişkisidir.
5. Uygulamalı Örnek: Kitap Bilgi Sistemi
Aşağıda yukarıdaki üç sınıfın birlikte nasıl kullanılabileceği gösterilmektedir.
#include <iostream>
#include <string>
using namespace std;
class Author {
private:
string name;
string country;
public:
Author(string n, string c) : name(n), country(c) {}
string GetName() const { return name; }
string GetCountry() const { return country; }
};
class Publisher {
private:
string name;
int foundedYear;
public:
Publisher(string n, int year) : name(n), foundedYear(year) {}
string GetInfo() const {
return name + " (" + to_string(foundedYear) + ")";
}
};
class Book {
private:
string title;
Author author;
Publisher publisher;
int pageCount;
double price;
public:
Book(string t, Author a, Publisher p, int pages, double pr)
: title(t), author(a), publisher(p), pageCount(pages), price(pr) {}
void DisplayInfo() const {
cout << "=== Kitap Bilgisi ===" << endl;
cout << "Başlık: " << title << endl;
cout << "Yazar: " << author.GetName()
<< " (" << author.GetCountry() << ")" << endl;
cout << "Yayınevi: " << publisher.GetInfo() << endl;
cout << "Sayfa Sayısı: " << pageCount << endl;
cout << "Fiyat: " << price << " TL" << endl;
}
};
int main() {
Author a("George Orwell", "İngiltere");
Publisher p("Penguin Books", 1935);
Book b("1984", a, p, 328, 89.90);
b.DisplayInfo();
return 0;
}
Çıktı:
=== Kitap Bilgisi ===
Başlık: 1984
Yazar: George Orwell (İngiltere)
Yayınevi: Penguin Books (1935)
Sayfa Sayısı: 328
Fiyat: 89.9 TL
Bu yapı, bir nesnenin (Book) başka nesneleri (Author, Publisher) içerebildiği nesne bileşimi (object composition) modeline örnektir. Gerçek uygulamalarda bu tarz sınıflar genellikle veritabanı modelleri veya API veri yapıları olarak kullanılır.
6. TL;DR
- Sınıflar veri (özellikler) ve davranışları (metotlar) bir arada tutar.
privatealanlar yalnızca sınıf içinde erişilebilir (encapsulation).publicmetotlar dış dünyaya kontrollü erişim sağlar (getter/setter).Book,AuthorvePublisherörneğinde “sahiplik” ilişkisi kullanıldı.- Constructor, nesne oluşturulurken özellikleri başlatmak için kullanılır.
- Tüm örnekler Visual Studio 2022 veya GCC 11+ derleyicilerinde çalıştırılabilir.