plazma - amatör bilgisayar kültürü

C++ ve Nesne Yönelimli Programlama

Bilgem (Nightlord) Çakır

Şekil 1.

1. Giriş

Merhaba sevgili okuyucular. Bundan böyle, bu köşede dünyada en çok kullanılan programlama dillerinden biri olan C++ dilini öğrenmeye başlayacaksınız. Aynı zamanda Nesne Yönelimli Programlama'nın (Object Oriented Programming, OOP veya bazen de Object Oriented Analysis and Design yani OOAD olarak yabancı kaynaklarda karşınıza çıkabilir) ne olduğunu ve C++ dili ile nasıl Nesne Yönelimli Programlama yapacağınızı görüyor olacaksınız. Nesne yönelimli programlama yapmak için kullanabileceğiniz tek dil C++ değil. Smalltalk, Java veya C# gibi başka nesne yönelimli diller olduğu gibi, zaten son yıllarda dünyadaki bütün programlama dilleri Nesne Yönelimli yaklaşımları bünyelerine katıyor. C++ bu diller arasında ihtimalen en yüksek bellek ve CPU performanslı programları üretebilmenize imkan tanıyan çok güçlü bir dil.

Temel olarak kursumuz bu iki kulvarda paralel ilerliyor olacak. Bir kulvarda C++ hakkındaki bazı kavramları öğrenirken, diğer kulvara atlayıp Nesne Yönelimlilik ile ilgili bazı kavramlara değineceğiz. Sonra tekrar C++ kulvarına geçip öğrendiğiniz yeni bir Nesne Yönelimli yaklaşımı C++ ile nasıl kullanacağınızı göreceksiniz.

C++ dünyadaki belki en güçlü programlama dillerinden olmasına karşın malesef yazılımcılar tarafından çoğu zaman verimsiz kullanılmaktadır. C++ kullanan pekçok yazılımcının bu güçlü “dilden” defalarca “dili” yanmıştır. C++'ı tam anlayıp öğrenmeden kullanmaya kalktığınızda size de çok zor gelebilir. Ancak bu gözünüzü korkutmasın. Bu dilin bütün inceliklerini yavaş yavaş başlangıç seviyesinden alarak inceleyecek ve anlatacağız. Herhangi bir başka programlama dilini bilmiyor olduğunuzu varsayacağım. Bu yüzden de en temel kavram ve komutlardan başlıyoruz. Bildiğinizi varsayacağım iki şey var. Birincisi işletim sisteminizde dosya ve klasörleri kullanabilmek. Yeni klasör ve dosyalar yaratıp silebiliyorsaniz tamamdır. İkincisi de işletim sisteminizde konsol programını açmayı bilmeniz. Yazdığımız programları yeni yaratacağınız text tabanlı dosyalara yazıp konsoldan derleyiciyi kullanarak çalışabilir (.exe) hale getiriyor olacağız.

Ayrıca genel olarak CPU ve Bellek gibi kavramlardan da bahseden Bilgisayar Mimarisine Giriş yazı dizisini de takip etmenizi tavsiye ederim.

1.1. Ön Hazırlıklar

Eğer Windows kullanıyorsanız ve hali hazırda yapmadıysanız yapmanız gereken bir ayar var. Hemen bir Windows Explorer penceresi açın. Üst menüden Araçlar->Klasör Seçeneklerini seçip orada “Bilinen dosya türlerinin uzantılarını gizle” seçeneğini bulun ve onu seçilmemiş hale getirin. Bu değişikliği yapınca artık Explorer'da bütün dosyaların .exe, .txt gibi uzantılarını görebiliyor hale geleceksiniz. Bu önemli değişikliği yapmazsanız sonra bazı basit hatalardan uzun vakitler kaybedebilirsiniz.

Bunun yanında kendinize bir çalışma klasörü oluşturun. Örneğin D:\kaynak veya /home/ahmet/kaynak vs gibi... Buraya kursun geri kalanında Kaynak Klasörü diyeceğim

1.2. Derleyici Kurulumu

C++ ile program yazabilmek için bilgisayarınızda derleyici (compiler) denilen bir yazılım kurulu olması gerekiyor. Bu kursta ilerlerken hangi işletim sistemini ve hangi derleyiciyi kullandığınızın bir önemi yok.

Eğer Windows kullanıyorsanız benim tavsiye edeceğim iki ücretsiz derleyici var. Bunlar Visual Studio Express (http://www.microsoft.com/express/download/) ve Mingw (http://sf.net/project/showfiles.php?group_id=2435 buradan en tepedeki Mingw Automated Installer seçeneğini kullanın ve kurulum sırasında g++ compiler seçeneğini işaretlemeyi unutmayın)

Eğer Linux kullanıyorsanız gcc adlı derleyiciyi kullanabilirsiniz. Büyük olasılıkla zaten sisteminizde kuruludur. Yine g++ seçeneğinin de kurulu olduğundan emin olun. Bazen gcc kurulu olup g++ olmayabilir, dikkat edin.

Windows ve Linux dışındaki bütün platformlarda da ihtimalen gcc'nin bir portu vardır.

Bu bahsedilen derleyicilerden birini kurduktan sonra, bir konsol penceresi açın (Visual Studio kullanıyorsanız, Başlat->Microsoft Visual Studio->Visual Studio Tools->Visual Studio Command Prompt; gcc için ise herhangi bir konsol). Derleyici programının adını yazın (VS için “cl”, gcc için “g++”). Eğer konsol size programı bulamadığını söylerse derleyiciyi kuramadınız demektir. Bu durumda web forumlarında yardım bulup bu problemi aşmaya çalışmalısınız.

Eğer aşağıdaki hatalardan birini alırsanız herşey yolunda demektir.

Gcc: no input file
VS: usage: cl ......

Artık kursa hazırsınız.

2. İlk Program

Şimdi ilk C++ programımızı yazacağız. Bunun için kaynak klasöründe yeni bir text dosyası yaratın ve adını “batsin.cpp” koyun. Daha sonra bu dosyayı bir editör ile (notepad, kate, emacs vs.) açın ve içine şu satırları yazın. Merak etmeyin birazdan bütün satırları açıklayacağız.

#include <iostream>

void main()
{
    std::cout<<“batsin bu dunya:)”<<std::endl;
    return;
}

Dosyayı kaydedin ve konsola geçin (genelde program yazarken bir editör penceresi ve bir konsol penceresini hep açık tutun) konsolda kaynak klasörüne gidin (ve hep orada kalın). Mesela Windows'da

> d:
> cd Kaynak 

Linux'da ise:

>cd home/ahmet/kaynak

Şimdi kodu derlemek için gereken komutu verin. Mesela VS derleyicisi için

> cl batsin.cpp

gcc için ise:

> g++ batsin.cpp

Eğer dosyayı yazarken herhangi bir harf veya noktalama işareti hatası yapmadıysanız şimdi kaynak klasörünüzde yeni çalışabilir bir dosya olacak. Bu dosyanın adını konsola girdiğinizde de ilk programınız çalışacak ve o muhteşem mesajı göreceksiniz.

2.1. Neler Oluyor

Şimdi programımızı inceleyeceğiz. Aslında bu en basit programda bile, iki satırda, oldukça ileri bazı konuların örnekleri var. Fakat aslında biz bu ileri konularla ilgili olan satırları çok basit bir amaç için kullanıyoruz. Kafanızın karışmaması için şöyle bir yol takip edeceğim. Şimdilik bu ileri düzeyde konularla ilgili olan iki satırı ne amaçla kullandığımızı söyleyip bir kalıp olarak ezberlemenizi isteyeceğim. Arka planda olan daha derin detayları daha sonra açıklamak üzere es geçeceğim.

Bahsettiğimiz bu iki satır birinci ve beşinci satırlar:

#include <iostream>

    std::cout<<“batsin bu dunya:)”<<std::endl;

Aslında büyük olasılıkla tahmin ettiğiniz üzere, bu satırları konsola programımızın yazı yazdırabilmesi için kullanıyoruz. Yazı yazdıran asıl komut beşinci satır. Tırnak işareti içindeki mesajı değiştirerek istediğiniz mesajı yazdırabilirsiniz. Bu satırdan birden fazla tekrarlayıp her birine farklı mesajlar da yazdırabilirsiniz. Mesela

#include <iostream>

void main()
{
    std::cout<<“batsin bu dunya:)”<<std::endl;
    std::cout<<“bitsin bu ruya”<<std::endl;
    return;
}

Birinci satırla ilgili bilmeniz gereken tek şey beşinci satırda gördüğünüz komutun çalışabilmesi için birinci satırın programınızın başında yer alması gerektiği.

Şimdi diğer satırları inceleyelim

void main()
{

    return;
}

Önce küme parantezlerine ( { ve } ) dikkatinizi çekmek istiyorum. Bu parantezler C++ dilinde kod satırlarını guruplamaya yararlar. Daha sonra göreceğimiz pekçok yapıda da bu gruplamayı görüyor olacaksınız. Bu örneğimizde küme parantezler programımızın tamamını grupluyor. Bu şekilde gruplanmış olan kod satırlarının oluşturduğu gruba “Kod Bloğu” denir.

Programın üçüncü satırında gördüğünüz int main() ifadesi burada kod bloğunun adını veriyor (aslında bu bir “fonksiyon” ve “kod bloğu” ve fonksiyon tam olarak aynı şey değillerdir ama fonksiyonları daha ileride anlatacağız). “main” isminin özelliği C++'daki varsayılan program başlangıç noktasını tanımlamasıdır. Yani programınızda yüzbinlerce satır kod ve onbinlerce kod bloğu olabilir ama programınız çalışmaya “main” isimli kod bloğundan başlar.

Altıncı satırda kod bloğunun içinde gördüğünüz return komutu da kod bloğundan çıkmaya yarar. Bu örneğimizde sadece tek bir kod bloğu olduğu için de bu bloktan çıktığımızda programımız sona eriyor.

Üçüncü satırda geçen void kelimesinin ve parantezlerin ne anlama geldiğini birazdan anlatacağım. Şu an öğrenmenizi istediğim nokta aslında bir C++ programının temel iskeleti. Bu iskelete tekrar bakalım.

2.2. Program İskeleti

Şimdi bir süre boyunca yazacağımız programları hep aynı iskelet içinde yazacağiz. Bu iskeleti aşağıda görüyorsunuz.

#include <iostream>

void main()
{
    komut 1;
    komut 2;
    komut 3;
    ...
    ...
    komut n;
    return;
}

Bu iskelete sahip olan programlarımız n tane komutu arka arkaya calıştırıyor olacaklar. Dikkat ederseniz her komutun sonunda noktalı virgül işaretini kullanıyoruz. Bu işaret C++'da bir komutun bittiği anlamına gelir. Eğer noktalı virgülü unutursanız, derleyiciniz derleme esnasında hata verecektir. Programlarımız bu şekilde art arda komutları işlettikten sonra return komutunda belirtildiği şekilde kod bloğumuzu terkederek sonlanacaklar.

Şu ana kadar iki komut öğrendik. Birincisi şimdilik tam anlamadan ezberlediğimiz yazı yazdırma komutu, diğeri de return komutu. Daha başka komutlar öğrenmeye başlamadan önce değinmemiz gereken önemli bir konu var.

3. Değişkenler

Değişkenler her programlama dilinde olan ortak bir kavramdır. Ben yıllar önce değişken kavramını ilk olarak C64 kullanma klavuzundaki BASIC öğreten bölümlerden öğrenmiştim. Hala kafamda oradaki cümlelerle bu konuyu ifade ediyorum. Şimdi size de aşağı yukarı oradakine paralel bir dil ile aktaracağım.

Değişkenleri içlerine bilgi koyup saklayabildiğiniz kutucuklar gibi düşünebilirsiniz. Bu kutulara her zaman yeni bir bilgi koyup her istediğimiz zaman da bu bilgiyi okuyabiliriz. Örneğin bir bilgisayar oyununda oyuncunun aldığı puanı saklayan bir değişken olabilir.

Her değişkenin programı yazan kişi tarafından tanımlanan bir “ismi” vardır. Örneğin oyuncunun aldığı puanları saklayan değişkenin ismini “skor” olarak belirleyebiliriz.

Değişkeni programda kullanırken amacımız, program çalışırken yapılan işlemlerin sonuçlarını saklamak ve lazım olduğunda sonra okumak, çeşitli olaylar sonucu değişkenin sakladığı değeri değiştirmek gibi çeşitli uygulamalardır. Örneğin Skor değişkenimizi programda tanımladıktan sonra, aşağıdaki sıralanan şekillerde kullanabiliriz.

  1. Oyuncu yeni oyuna başlarken skora sıfır yaz.

  2. Oyuncu bir düşmanı vurunca skora 5 ekle.

  3. Ekrana oyuncu skorunu yazarken şu anki skoru skor değişkeninden oku.

3.1. Değişkenlerin Tipleri

C++'da her değişkenin bir “tipi” vardır. Bir değişken sadece kendi tipinden bir bilgiyi saklayabilir. Örneğin bir değişkenin tipi “tam sayılar” ise bu değişkene “yazı” tipinden bir bilgi yazamayız. Tip, bir değişkenin üzerinde yapılabilecek işlemleri tanımlar. Örneğin tamsayı tipindeki bir değişkeni aynı tipteki başka değişken ve sabitlerle “toplama” işlemine sokabiliriz. Ancak bir tamsayı ile bir yazıyı toplayamayız (Elma ile armutu toplamayın derdi ya ilkokul öğretmenlerimiz onun gibi :) )

C++ dilinde en sık kullandığımız temel tipler arasında şunlar vardır:

  1. char. Yani tek harf veya sembol. Örneğin a, K, z, :, ?, +

  2. int. Yani tamsayılar. Örneğin 12, -185, 12456

  3. float. Yani ondalıklı sayılar. Örneğin 2.57, -0.568, 458.366

3.2. Değişkenlerin İlan Edilişi

Programınızda bir değişkeni kullanabilmeniz için bu değişkeni ilan etmeniz (declaration) gerekir. Bir değişkenin ilan edilmesi aşağıdaki gibidir

Tip isim;

Örneğin

int skor;

Burada skor adında ve tamsayı tipinde bir değişken kullanacağımızı ilan etmiş oluyoruz. Bunun sonucu olarak bilgisayar şu demin bahsettiğimiz gibi bir “kutucuk” hazırlıyor bellekte, ve bu kutucuğa skor ismini veriyor. Aynı zamanda kutucuğun saklayabileceği değerlerin tamsayı tipinde olması gerektiğini de saklıyor. Biz eğer programımızın başka bir yerinde yanlışlıkla skor değişkenine tamsayı tipinde olmayan bir değer yazmaya çalışırsak derleyici bize hata döndürecek.

Bu şekilde değişkenimizi tanımladıktan sonra içine yazıp okuyabiliriz. Örneğin aşağıdaki programa bir bakın

#include <iostream>

void main()
{
    int skor;
    skor = 0;
    std::cout<<skor<<std::endl
    return;
}

Burada ilk komut ile skor değişkenini ve onun tipini ilan ettik. Ardından gelen komut ile bu değişkenin içine 0 değerini yazdık. Ardından sihirli “konsola yazdırma” komutumuz ile skor değişkeninden okuduğumuz değeri ekrana yazdırdık.

4. Gelecek bölümde

Kursun bu ilk bölümünü burada kesiyoruz. Anlamadığınız yerler veya gördüğünüz hatalar olması durumunda bize yazmaktan çekinmeyin. Gelecek bölümde kullanıcıdan veri okuma, sabitlerin kullanımı, ve if komutu ile tanışacağız. If komutu, en önemli komutlardan biri ve şu ana kadar yazdıklarımızdan çok daha ilginç programlar yazabilmemizi sağlayacak.

plazma - 2008