c ile c++ arasındaki farklar

  1. c++' ın en önemli farkı object-oriented olmasıdır. c procedural bir dildir. procedure=function gibi düşünün. c de veya procedural herhangi bir dilde program fonksiyonlara parçalanarak tasarlanır. yani temel parça fonskyionlardır. c++ da programların temel birimi nesnelerdir.

    örneğin bir satranç oyununu simule eden programda bazı nesneler satranç tahtası, piyon, vezir, vs olacaktır.

    diğer bi örnek olarak otomobili ele alalım. bu nesnenin direksiyon, fren, kapı gibi elemanları oldugu gibi gitmek, durmak, hızlanmak gibi özellikleri de vardır. hatta bu alt elemanların da kendilerine ait elemanlari ve özellikleri ve otobomil nesnesinin de üyesi olduğu daha kompleks bir nesne düşünülebilir. c++ böyle karmaşık yapıları tasarlayabilmeyi kolaylaştıran bir araçtır.

    nesne yönelimli programlamanın ortaya çıkışında yatan ilham kaynaği olan unsur gerçek dünyayı modelleyebilmektir.

    bu tarz yapılar c de olmayan bir keyword olan class ile kurulur. class yapılarının c deki struct veri yapısına benzediği kısmen doğrudur fakat class yapıları içinde fonksiyon tanımlanabilir.

    c de oluşturulan iki tane farklı yapı düşünün. x ve y olsun. x i y ye kopyalamak için

    y = x;

    gibi bir ifade c de kullanılamaz. c++ ile kopyalamanın ne şekilde olacağını belirterek yapılabilir.

    bu işlemler c ile de bir şekilde yapılabilir, o halde neden c++ denilebilir? aslında c++ ile yazılan tüm programlar kesinlikle c ile de yazılabilir. fakat programların boyutu büyüdükçe, karmaşıklıgı arttıkça ve zaman önemi düşünüldüğünde program yazabilmekten ziyade hızlı, kolay ve efektif bir şekilde program yazmanın gerekliliği ortaya çıkıyor. object-oriented programlama bunu sunuyor.

    diğer bir fark c++ da bulunan operator overloading kavramıdır. örneğin tarih adlı bir class olsun. bu class türünden tarih1 adlı bir nesnenin yıl, ay, gün, saat vb. elemanları olsun. buradaki class diye bahsedilen kavramı c deki struct yapısı gibi düşünün. tarih2 isimli ikinci bir tarih türünden nesne olsun. bu iki tarih arasındaki farkı bulmak ve sonucu da tarih3 isimli bir değişkene atama işlemi c dilinde şöyle yapılabilirdi. önce tarihcikar adlı bir global fonksiyon yazılır ve bu nesneler tarihcikar fonksiyonuna argüman olarak gönderilir. fonksiyonun geri dönüş değerini de tarih3 adlı değişkene atanır. yani;

    tarih3 = tarihcikar(tarih2, tarih1);

    gibi...

    aslında background da c++ da da yapılan şey bundan pek farklı değildir. fakat c++ ile kullanımı daha doğal olacaktır. c++ da bu işlem operator overloading ile şu şekilde yapılabilir;

    tarih3 = tarih2 – tarih1;

    iki tarihi kıyasladığınızı düşünün. burada da tarih2 > tarih1 şeklinde bir ifade kullanılabilir.

    c de her ne kadar farkında olmasakta operator overloading vardır. örneğin; 2 + 3 veya 2.5 + 3.7 işleminde olduğu gibi. burada + operatörü birinde int ve diğerinde double türden olmak üzere farklı türden operand alıyor ve operandların türüne göre farklı bir şekilde işlem yapıyor. c++ da bu tür ifadeleri programcılar kendi yazdıkları türler için de oluşturabilir.

    diğer bi fark function overloading. karealinteger isimli bir fonksiyon olsun. fonksiyonun yaptığı iş argüman olarak gönderilen int türünden bir değerin karesini almak olsun. fonksiyona double türden bir değer gönderildiğinde doğru çalışmayacaktır. double türden değerler için işlem yapan karealdouble isimli yeni bir fonksiyon yazmak gerekecek, tabi c dilinde... c++ ta function overloading ile aynı isimli fonksiyonların farklı şekillerde çalışması sağlanabilir. örneğin kareal(5), kareal(5.5) ve hatta kareal(“cplusplus”) gibi. tüm bu durumlarda fonksiyonun adı değişmeyecek şekilde, aldığı argümanın türüne göre yaptığı işlemler değişebilir. hangi fonksiyonun çağırıldığı ise alınan parametrelerin sayısı ve türlerine göre belirlenir.

    diğer bi fark inheritance. inheritance object-oriented programlamanın en önemli konularındandır. class lar arası ilişkiyi/hiyerarşiyi belirlemek ve bu hiyerarşiden faydalanmak için türetme yapılır. örneğin kendisinden özelleşmiş sınıflar türetilen ve bu sınıfların en genel/ortak özelliklerini barındıran şekil isimli bir taban sınıf ve bundan türeyen kare, dikdörtgen, daire gibi onlarca sınıf olsun. şekil sınıfından türeyen çok sayıda sınıf varsa, türetme yardımıyla bu sınıfları kullanmak kodun revize olmasında kolaylık sağlar. bu yöntemle şekil taban sınıfındaki değişiklikler tüm sınıflara yansır.

    diğer bi fark polymorphism. object-oriented programlamada ki en complex konular arasında yer alır. türetme konusuyla iç içedir. o nedenle türetme konusunun iyi bir şekilde anlaşılmış olması gerekir. şöyle örneklendirelim; türetilen sınıflara ilişkin öyle bir metot olsun ki kavramsal olarak tüm sınıflarda aynı işi icra etsin fakat yaptığı işlem her bir türetilen sınıf için farklı olsun. şekil sınıfının alanhesapla isimli bir metodu ve türeyen sınıfların her birinin bu metodu kendileri için farklı bir şekilde yeniden tanımlaması gibi. bu mekanizmayı kurmak için sanal fonksiyon lar vardır. taban sınıfta önceden tanımlanır veya bildirimi yapılır ve türetilen sınıflarda yeniden bildirimi yapılarak istenilen şekilde çalışması sağlanır..

    c++ da yer alan artı bi özellik ise standart template library. türkçesi şablon bazlı kütüphane. template bazlı sınıfların yer aldığı bir kütüphaneden ve türden bağımsız algoritmalardan oluşmaktadır. template bazlı ifadesi kütüphanenin türden bağımsız olduğunu ifade eder. function overloading olayını anımsatsa da mantığı biraz daha farklı. şöyle bir örnekle ele alalım. bir sınıfın temelde yaptığı işlem türden bağımsız olsun. öyle ki class ı yazarken tür bilgisine dair hiçbir bilgiye gerek kalmasın. herhangi bir x türü için yazıyormuş gibi class yazılacak ve kullanılırrken istedinilen türe göre tanımlanabilecek. yani class oluşturulurken algoritma yazılacak ve tür bilgisiyle ilgilenilmeyecek. c++ ta bu şekilde hazırlanmış ve standart haline gelmiş geniş bir kütüphanesi mevcuttur. tabi programcılar da bu tür class ları oluşturabilir.
    shan,19.10.2009 08:15,#711