Bu yazımız C++ programlama dili ile alakalı temel olarak bilmemiz gereken bir takım bilgileri, en temel uygulamalardan birisi olan ekrana yazı yazdırma uygulamasının nasıl gerçekleştirildiğini, programlama süreçlerinde çok önemli bir yere sahip olan değişkenler konusunu ve iyi bir hafıza yönetimi için bilinmesi gereken temel bir konu olan İşaretçiler konusunu içermektedir.
Bu eğitimimizde geliştirme yaparken günümüzde C++ evreninde çok yaygın bir şekilde kullanılmakta olan C++ 14 standartlarını kullanarak geliştirme yapacağız.
Temel Bilgiler ve Merhaba Dünya
C++ programlama dili ile bir program geliştirirken C++ diline ait olan ifadeleri kullanırız. Programımız derlenirken derleyicimiz ilk olarak main function içindeki fonksiyonları çalıştırmaktadır ve main function’ın ilk satırında başlayarak aşağıya doğru dizin içerisindeki tüm işlemleri sırasıyla yerine getirir. Bu sebepten dolayı bir program geliştirirken programımızın işlevlerini öncelik sıralarına göre ilk olarak program dizinimiz içerisinde bulunan main function isimli fonksiyonumuzdan başlayarak yazmalıyız.
#include <ilgili kütüphanenin ismi>: Bir ön işlemci direktifidir, daha önce yazılmış bir kod içerisinde bulunan bir özelliği programımız içerisinde kullanabilmemiz için kullanılan, başka bir deyişle kütüphane tanımlamak için kullandığımız bir ifadedir. Ön işlemci kodunun hemen bitişiğine yani aynı satırda başka bir kod bloğu yazılmaz.
int main() { fonksiyon içerisinde gerçekleştirilecek işlemler }: Burada derleyiciye adı main olan bir fonksiyon tanımladığımızı söylüyoruz. Fonksiyon oluşturulduktan hemen sonra yazılan süslü parantezlerin arasında kalan kısım oluşturmuş olduğumuz fonksiyonun etki alanını, yani fonksiyonumuza dahil olan ifadeleri belirtmektedir.
Noktalı Virgül (;) : Pek çok programlama dilinde de olduğu gibi, C++ dilinde de noktalı virgül özellik ifadelerimizin sonlarına, programımızın doğru bir şekilde çalışması için yerleştirmemiz gereken önemli bir zorunluluktur.
Yorum Satırı (//) : Yorum satırı iki adet eğik çizginin arda yazılmasıyla oluşturulur ve başına // yazılan ifade artık kod bloğumuz içinde sadece kullanıcı için önem arz eden bir yapıya dönüşür. yorum satırları oluşturmuş olduğumuz eski projelerimize geri döndüğümüzde yada büyük bir proje ile uğraşırken kod blokları arasında kaybolmadan, kodumuzun nasıl çalıştığını yada ne yaptığını anlamak açısından, kullanımı programcılar için oldukça faydalı olan bir özelliktir.
Programımızı yazarken boş bırakmış olduğumuz satırlar ve yorum satırları derleyici için hiçbir şey ifade etmez yok hükmündedir, yani kodunuzun daha anlaşılır olması için istediğiniz kadar boşluk bırakabilir yada hiç boşluk bırakmadan da yazabilirsiniz.
Bu yazı serimin başlangıcında belirtmiş olduğum IDE’yi (Visual Studio Community) kullanırken, eğer ortamınızda daha önce derlemiş olduğunuz bir projeniz varsa, proje dosyanızın içinde olsanız da varsayılan olarak önceden derlemiş olduğunuz proje çalışacaktır. Bu durumu engelleyip yeni projenizi derleyebilmek için, varsayılan olarak sol veya sağ tarafta bulunan çözüm gezgini ekranından, proje dosya isimlerinin bulunduğu listeden derlemek istediğiniz proje dosyasının üstüne gelip sağ tıklayarak, başlangıç projesi olarak ayarla seçeneğini seçmeniz gerekmektedir.
Return 0: Return değer döndürmek için kullanılan bir ifadedir. Mesela int türünde yani bir tamsayı döndürmesini bekleyeceğimiz bir fonksiyonumuz var, bu fonksiyonumuzun içerisinde gerçekleştirilen işlemden bağımsız olarak, bu ifadeyi kullanıp bir değer döndürmesini ve programımızın düzgün bir şekilde çalışmasını sağlıyoruz.
\n: Bu ifade imlecin bir alt satıra geçmesini sağlamaktadır. Bu ifadenin kullanılmış olduğu ekrana yazdırma uygulamalarında, bu ifade kendinden sonra ekran yazdırılan yazının bir alt satırda yer almasını sağlar.
\t: Bu ifadenin bulunduğu yerden itibaren Tab kadar aralık bırakılır. Bu ifadenin kullanılmış olduğu ekrana yazdırma uygulamalarında, bu ifade kendinden sonra ekran yazdırılan yazının bir Tab kadar uzağa yazılmasını sağlar.
std::cout << ekrana yazdırılacak veri : Bu ifade ile ekrana bir yazı yazdırılması sağlanır. Ekrana yazdırılacak veri düz yazı tipinde ise ekrana yazdırılacak veri çift tırnak içinde yazılır, eğer verimiz bir sayı işe çift tırnak kullanılmaz.
#include <iostream>
int main()
{
//ekrana Merhaba Dünya yazdırır
std::cout << "Merhaba Dünya\n";
return 0;
}
Değişkenler
Değişken oluşturma işlemi temelde RAM’de tutacağımız çeşitli veriler için oluşturmuş olduğumuz, onları tekrar çağırırken işimizi kolaylaştırmak yada programlarımızı daha komplike daha işlevli hale getirmek için kullanmış olduğumuz verilerle eşlenmiş isimlerdir.
C++ Programlama dilinde belleğe direk olarak erişme şansımız yoktur. Veriler bellekte tutulurken adres ve değer kısmı olarak farklı kısımlarda tutulur. C++ dilinde bu değere ulaşmak için arada bir nesne kullanmak gerekir ihtiyacımız olan nesne işlevini tanımlamış olduğumuz değişkenlerimiz karşılamaktadır.
Değişkenler iki kısımdan oluşurlar. ilk kısım belleğin daha verimli bir şekilde kullanılması, daha iyi bir şekilde yönetilmesinin sağlaması amacı ile oluşturulan, verimizin ihtiyaç duyacağı saklama alanı ile alakalı olan değişken türünü ifade eden kısımdır. ikinci kısım ise değişkenimizin adıdır bu ifade değerimiz ile eşlenir ve biz bu adı kullandığımızda hafızandan bu ad ile eşlenmiş olan veriyi çekmiş oluruz.
Mesela değişkenlerimiz eğer değerimiz işlemler süresince farklı uygulamalarda defalarca değişebilecek bir değer işe, defalarca farklı sayılar ile aynı işlemi 3+5; 9+5; 8+9; seklinde yazmak yerine, sayı1+sayı2; ve benzeri bir şekilde sadece bir kere yazarak uzun vadede zamandan kar etmemizi sağlar ve bu durum programlamanın temel avantajından bir tanesidir.
C++ dilinde değişkenler sayı veya özel karakterlerle başlayamaz ama bitirilebilmektedir. C++ büyük ve küçük harflere duyarlıdır yani sayı1 ve Sayı1 değişkenleri iki farklı değeri ifade eder. C++ derleyicisi için özel anlam ifade eden else, this, if, return, void gibi bazı ifadeler değişken olarak kullanılmaz, bu ifadeler www.informit.com sitesinden almış olduğum aşağıdaki tablo içerisinde mevcuttur.
asm | else | new | this |
auto | enum | operator | throw |
bool | explicit | private | true |
break | export | protected | try |
case | extern | public | typedef |
catch | false | register | typeid |
char | float | reinterpret_cast | typename |
class | for | return | union |
const | friend | short | unsigned |
constexpr | goto | signed | using |
continue | if | sizeof | virtual |
default | inline | static | void |
delete | int | static_cast | volatile |
do | long | struct | wchar_t |
double | mutable | switch | while |
dynamic_cast | namespace | template |
Değişkenler Konusu için Örnek Proje
#include <iostream>
int main()
{
//sayı1 ve sayı2 değişkenleri int yani tam sayı olarak tanımlanıp
//birbirinden çıkarılarak ekrana yazdırılacak
int sayı1 = 2;
int sayı2 = 5;
std::cout << sayı2-sayı1 ;
//sonrasında yazdırılacak verinin daha okunur olması için
//imleç bir alt satıra geçirilecek
std::cout << "\n";
//sayı3, sayı4 ve toplam değişkenleri int yani tam sayı olarak tanımlanıp
//toplandıktan sonra toplam değişkenine aktarılarak ekrana yazdırılacak
int sayı3 = 8;
int sayı4 = 3;
int toplam;
toplam = sayı3 + sayı4;
std::cout << toplam;
//sonrasında yazdırılacak verinin daha okunur olması için
//imleç bir alt satıra geçirilecek
std::cout << "\n";
//sayı5, sayı6 ve çarpım değişkenleri aynı satırda int yani tam sayı olarak
//tanımlanıp değişkenlerimize değer atandıktan sonra çarpılarak çarpım sonucu
//carpım değişkeni içerisine aktarılıp ekrana yazdırılacak
int sayı5, sayı6, carpım;
sayı5 = 7;
sayı6 = 5;
carpım = sayı5 * sayı6;
std::cout << carpım;
//sonrasında yazdırılacak verinin daha okunur olması için imleç
//bir alt satıra geçirilecek
std::cout << "\n";
}
İşaretçiler (Pointers)
&x : Bu ifade x değişkeninin bellekte tutulduğu adresi temsil etmektedir. Bir verinin bellekte tutulduğu adresi çektiğimiz zaman her zaman için verinin tutulduğu adres bloğunun ilk bloğunu bize getirir. Örneğin bellekte 4 byte yer kaplayan int yani tamsayı türünde bir değişkenimiz varsa ve bu değişken bellekte 6. ve 9. bellek adresleri arasında tutuluyor işe biz bu değişkenin adresini çektiğimizde karşımıza çıkacak bellek adresi 6 olacaktır.
int* xptr = &x : Bu örnekte x değişkenimizin adresi xptr değişkeninin içerisine aktarılmıştır. Bellek adresimizi bir değişkenin içerisinde saklamak istediğimizde örneğin normal int şeklinde bir bellek bölgesi tanımlayamayız, bellek adresimizi saklayabilmek için int* şeklinde bir bellek bölgesi tanımlamamız gerekmektedir. Bir veri türünün sağ tarafına yukarıdaki gibi bir yıldız işareti koyduğumuz zaman o bölge artık bir sayı değil bir bellek adresi tutmaya başlar. Bunun gibi uygulamalarda boşlukların derleyici için hiçbir şey ifade etmediğini unutmamak öğrenmeniz açısından kolaylaştırıcı olacaktır, bu ifade ile int*xptr=&x ifadesi derleyici için tamamen aynı şeyi ifade eder.
*xptr: Bu şekilde yukarıdaki ifade de görüldüğü üzere x değişkeninin işaretçisi olarak tanımladığım yani x değişkeninin adresini tutan xptr değişkeni bu şekilde sol tarafında bir yıldızla ifade edilmesi ile artık x değişkenin saklamış olduğu veriyi temsil eder hale gelmiş olur.
Sonuç olarak değişkenimizin sol tarafında & ifadesini kullandığımızda ilgili değişkenin bellek adresine ulaşırız, değişkenimizin sol tarafında * ifadesini kullanmamızda işe ilgili değişkenimizin işaret ettiği bellek adresindeki veriye ulaşmış oluruz.
İşaretçiler (Pointers) Konusu için Örnek Proje
#include <iostream>
int main()
{
int x= 15;
// xptr nin içerisine x değişkeninin karşılık geldiği verinin adresi aktarılacak
int* xptr = &x;
// aşağıdaki ifadeler x değişkeninin tuttuğu verinin adresini ekrana yazdıracak
std::cout << &x;
std::cout << xptr;
std::cout << &*&x;
std::cout << &*xptr;
//sonrasında yazdırılacak verinin daha okunur olması için imleç
//bir alt satıra geçirilecek
std::cout << "\n";
// aşağıdaki ifadeler x değişkeninin tuttuğu veriyi yani 15'i ekrana yazdıracak
std::cout << x;
std::cout << *&x;
std::cout << *xptr;
std::cout << *&*xptr;
}