15 Şubat 2018 Perşembe

C++ ‘da Struct ve Class Yapıları

Merhaba arkadaşlar bu yazıda Struct ve Class  yapılarından bahsedeceğim.
STRUCTURES
Struct farklı tipteki elemanları içinde barındıran bi küme gibi düşünülebilir. Array gibi davranır. Array tek tip verileri toplayan bi küme iken, struct daha kapsamlıdır( aynı anda hem int hem double gibi değişik tipte birden çok değişkeni olabilir). Struct, içindeki değişkenler declare edilmeden önce mutlaka define edilmelidir ( tanımlanmalıdır).
Structure Types ( Struct Tipleri )
Structlar, global olarak tanımlanmalıdır.
// Örnek struct yapısı
1
2
3
4
5
6
struct CDAccountV1 // Name of new struct "type"
{
    double balance; //member names
    double interestRate;
    int term;
}; //struct tanımlandıktan sonra buradaki noktalı virgül mutlaka olmalı
Struct ‘ ın içindeki değişkenler member yani üye olarak adlandırılır. Buradaki balance, interestRate, term CDAccountV1 struct’ının üyeleridir.
Declare Structure Variable ( Struct Tipindeki değişkeninin ifade edilişi )
1
CDAccountV1 account; //CDAccountV1 tipinde account değişkeni
Accessing Structure Members ( Struct ‘ın üyelerine erişme)
Üyelere erişmek için dot(nokta) operatörü kullanılır.
1
2
3
account.balance
account.interestRate
account.term
Yukarıda gördüğünüz gibi, account değişkenin 3 tane member’ı var. Ve bunlara erişmek için dot operatörünü kullandık.
Farklı struct yapıları aynı değişken adına sahip üyelere sahip olabilir, bu çakışmaya yol açmaz. Yani buradaki balance bi member ve CDAccountV1 ‘ e ait. Aynı zamanda BalanceV1 adında bi struct ‘ın da balance adında bi member ‘ ı olabilir.
Structure Assignments ( Struct Atamaları )
CropYield ( mahsul verimi ) adında bi struct yapımız olsun. oranges ve lemons adında iki değişkeni olsun.
1
2
CropYield oranges, lemons; //Bu şekilde iki değişken tanımladık.
oranges = lemons; /*Böyle bir atama yapmamız mümkün.Bütün memberlar kopyalanıyor*/
Structures as Function Arguments ( Structların Fonksiyona Argüman Olarak gönderilmesi)
Pass-by-value, Pass-by-reference ,Or combination
Yani structlar fonksiyonlara referans olarak, değerini kopyalamak için ya da her iki gönderim şekli birlikte kullanılarak da argüman olarak kullanılabilir.
Diğer veri tiplerinde olduğu gibi , bi fonksiyonun return tipi olarak da kullanılabilir.
Initializing Structures ( Struct’ların İlklendirilmesi )
// Örnek kod parçası
1
2
3
4
5
6
7
struct Date
{
    int month;
    int day;
    int year;
};
Date dueDate = {10, 24, 2016};
CLASSES ( Sınıflar )
       Nesneye dayalı programlamanın temelinde sınıf yapısı vardır. Re-usable code ( yeniden kullanılabilir kod ) yazmak için sınıflar kullanılır.
      Class, yapı olarak struct a benzer . Struct ‘ın daha gelişmiş versiyonu olarak düşünülebilir. Struct’tan farklı olarak sınıflar aynı yapının üzerinde çalışacak fonksiyonlar içerir.
// Örnek Class Yapısı
1
2
3
4
5
6
7
class DayOfYear // name of new class type
{
    public:
    void output(); // member function
    int month;
    int day;
};
Declaring Objects ( Nesne Tanımlama / İfade Etme)
1
DayOfYear today, birthday;
Bu objeler, data(veri) ve operasyon (member fonksiyon) içerir. Yukarıdaki örnekteki datalar month ve day , operasyon ise output() fonksiyonudur.
Class Member Access ( Sınıfın Üyelerine Erişme )
Tıpkı struct’taki gibi dot operatörü kullanılarak erişilebilir.
1
2
3
today.month
today.day
today.output();
Class Member Functions ( Sınıfın Member Fonksiyonları )
Diğer fonksiyonlara benzer şekilde main ‘den sonra tanımlanmalıdır.
1
2
3
4
void DayOfYear::output()  //DayOfYear'a ait olduğunu belirtmek için
{
…  //burada member fonksiyonda yapılmak istenenler yer almalı.
}
Class Member Functions Definition ( Member Fonksiyonların Tanımlanması )
Fonksiyonlar, class’ın bütün objeleri için kullanılır. Örnek kullanım -> today.output();
today objesi için output() fonksiyonu kullanımı bu şekildedir, DayOfYear tipinde başka objeler oluşturarak , diğer datalar ve output fonksiyonuna dot operatörü ile erişilebilir.
1
2
3
4
5
6
7
8
9
10
void input(); // böyle bi fonksiyonu class'ın içine ekleyebiliriz.
 
void DayOfYear::input()// fonksiyonun implemantasyonu ise şu şekilde yapılabilir.
{
    cout <<" Enter  date: \n ";
    cout << " Enter month ";
    cin >> month;
    cout << "Enter day ";
    cin << day ;
}
Dot and Scope Resolution Operator ( . ve  :: operatörleri )
dot operatörü(.), objenin member ini specify etmek için kullanılır
scope resolution(::) ise, member fonksiyonun hangi class tan geldiğini görmek için kullanılır.
A Class’s Place ( Bir Sınıfın Yeri )
Class; double, int vb. tipler gibi kullanabileceğimiz , diğer veri tipleri üzerine gerçekleştirdiğimiz operasyonları üzerinde gerçekleştirebileceğimiz bir veri tipidir. Herhangi bi data tipini nasıl kullanıyorsak , class’ ı da aynı şekilde rahatlıkla kullanabiliriz.
Class’ın kendi değişkenleri vardır bunlara daha önce de belirttiğim gibi obje adı verilir.
Encapsulation ( Kapsülleme )
Bütün verileri ve veri üzerinde çalışan bütün operasyonları(data üzerinde gerçekleşen işlemler), aynı veri yapısının içine koymaya encapsulation(kapsülleme) denir. Herhangi bir veri tipini içerebilir.
Nesneye dayalı programın temellerindendir. Class yapısı sayesinde encapsulationişlemini gerçekleştirebiliyoruz.
Abstract Data Types ( Soyut Veri Tipleri)
Programı kullanan kullanıcının, daha önceden yazılmış olan sınıfın detaylarını bilmemesi, soyutlaştırma yapılmasıyla alakalıdır. Abstract Data Tipleri kullanılarak , soyutlaştırma yapılır.
Principles of OOP ( Nesneye Dayalı Programlamanın Prensipleri )
Information Hiding-> kullanıcının bilmesine gerek olmayan tüm bilgileri, operasyonların nasıl yapıldığını saklamak.
Data Abstraction -> Verinin nasıl manipüle edildiği ile ilgili detayları gizlemek.
Encapsulation -> birbiri ile ilişkili veri ve operasyonları bir araya getirmek.
Public and Private Members
Kullanıcının doğrudan erişimine ihtiyacı olmayan bilgiler private(gizli) olarak tanımlanır. Sınıfı kullanan programcıların erişmesinde ve bilmesinde bi sakınca olmayan ve kullanıcının işine yarayacak bilgiler ise public(açık) olarak tanımlanır.
Class yapısı içinde public olanlar ile private olanlar yazılırken herhangi bi sıralama zorunluluğu yoktur.  Yani istersek önce public olanları istersek de önce private olanları tanımlayabiliriz. Public olanların önce tanımlanması yaygın olan kullanım şeklidir.
1
2
3
4
5
6
class MyClass{
    public:
    ......//data and operations which are public to user, user must be know this
    private:
    ....... // data and operations which are private to user
};
Accessor and Mutator Functions
Accessor -> sadece sınıfın data memberlarına erişen fonksiyonlar.
Mutator -> çağırdığımızda objeyi değiştirebilen fonksiyonlar.
Diyelim ki , MyClass class1; diyerek bi obje oluşturduk. class1 objesi yalnızca publicolan memberlara erişebilirprivate olanlara erişme izni yoktur.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/******************* Class Örneği *************************************/
 
class DayOfYear
{
public:   // kullanıcıya açık olan kısım
void input( );   // mutator function
void output( );  // accessor function
void set(int newMonth, int newDay); //mutator function
//Precondition: newMonth and newDay form a possible date.
 
void set(int newMonth);
//Precondition: 1 <= newMonth <= 12
//Postcondition: The date is set to the first day of the given month.
 
int getMonthNumber( ); //Returns 1 for January, 2 for February, etc.
int getDay( );
private: // kullanıcıdan gizlenmiş kısım
int month;
int day;
};
 
/*********************************************************************/
Structures versus Classes ( Struct ve Class Yapısının Karşılaştırılması )
  • Structların üyeleri (member) public olarak kabul edilir. Yalnızca veri içerir, fonksiyon içeremez.
  • Class yapısında ise, class’ın içinde memberların private ya da public olduğunu belirtmez isek , default olarak hepsi private tanımlanmış kabul edilir.
  • Teknik olarak benzer yapılardır, mekanizma olarak ise farklıdırlar.
Interface of Class –> Bi sınıfın arayüzü public olan fonksiyonlarıdır. Arayüz sayesinde, kullanıcılar sınıfları kullanabilir hale gelirler.
Bu derste Struct ve Class yapılarını genel özellikleriyle anlatmaya çalıştım. Bir sonraki derste Class yapısı ile ilgili daha ayrıntılı bilgiler vermeye çalışacağım, diğer derste görüşmek üzere 🙂

Hiç yorum yok:

Yorum Gönder