top of page

C++ ve C Programlama Dillerinin Farklılıkları

  • Writer: Yusuf Hançar
    Yusuf Hançar
  • Apr 26, 2023
  • 7 min read

Updated: Jan 19, 2024

Bu yazıda C programlama dili ile yazılım dünyasına adım atan programcıların C++ programlama dili ile tanıştıklarında karşılaştıkları farklılıklardan bahsedilmektedir. C++ dilinin 1979 yılından içinde bulunduğumuz 2023 yılı standartlarının konuşulduğu ve geliştirildiği bir serüveni bulunmaktadır. C programlama dili ile birçok benzerliği bulunduğu için kullanılan temel yapılar zamanla hem OOP hem de standart kütüphanesinin gelişimi ve uyumu ile değiştiği için farklılıklarını iyi kavramak faydalı olacaktır. Sonraki yazılarda modern C++ standartları üzerinden dilin gelişimi ve değişimi daha belirginleşmiş olacaktır. Tabi buradaki farklılıklar incelenirken C programlama dilinin de C++ gibi geliştirildiği ve standartlarının değiştini unutmamak gerekmektedir. 1970 dönemlerinden 2011 yılındaki C11 olarak belirlenen sürecin de bilinmesi teknik anlaşılırlığı pekiştirecektir.

C++ programlama dilinin bu gelişim ve değişim süreci içerisinde; sınıfların(class) eklenmesi, C++ ismini alması, derleyici desteği ile standartlarının(ISO/IEC 14882:2020(E)) belirlenmesi, 2000'li yıllarda periyodik olarak standartları belirlenerek yayınlanmasına kadar birçok aşamadan geçmiştir.

Bazı temel ISO C++ kurallarını yazalım ancak en detaylı bilgi için kullanılan derleyicinin kuralları incelenmelidir. " https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines "
  1. Karakter Dizilerinde Değişiklik Yapmak (String Literals): C++ standartlarına göre, string literalleri doğrudan değiştirmek yasaktır. Yani "hello"[0] = 'H'; gibi bir ifade hatalıdır.

  2. Const Olmayan İşaretçileri Const İşaretçilere Atama: Bir const olmayan bir işaretçiyi, const bir işaretçiye atamak, tersi gibi durumlar C++ standartlarına uymayan kullanımlardır.

  3. Sabit ifadelerle Modifikasyon Yapma: Bir sabit ifadeyi (örneğin, sabit bir sayı) değiştirme girişimi hatalıdır. Örneğin 42 = 10; gibi bir atama hatalıdır.

  4. Dizileri Direkt Atama: C++ dizileri doğrudan atama operatörü ile atanamaz. Örneğin int arr[5]; arr = {1, 2, 3, 4, 5}; gibi bir atama hatalıdır.

  5. Referansları Yeniden Atama: Bir referansı başka bir nesneye yeniden atamak genellikle mümkün değildir. Referans bir kez atanıldığında başka bir nesneyi gösteremez.

  6. Referansları Const Olmayan İfadelere Atama: Bir const olmayan ifadeye, bir referansı atamak C++ standartlarına uymayan bir kullanımdır.

  7. Private veya Protected Üyelere Erişim: Sınıf üyeleri private veya protected olarak işaretlendiyse, bu üyelere dışarıdan erişim genellikle yasaktır.

  8. Döngü Değişkeni Olarak const Kullanımı: Bir döngü değişkeninin tanımlanmasında const kullanmak genellikle hatalıdır. Örneğin for (const int idx = 0; idx< 3; ++idx) gibi bir kullanım hatalıdır.

  9. Bir Fonksiyonu const Olmayan Bir Fonksiyona Atama: Bir const olmayan bir fonksiyonu, const bir fonksiyona atamak veya const bir işaretçiye bağlamak, C++ standartlarına aykırıdır.

  10. Bir const Fonksiyonu const Olmayan Bir İşlevde Kullanma: Bir const olarak işaretlenmiş bir fonksiyonun, const olmayan bir işlevde çağrılması C++ standartlarına aykırıdır.

Günümüzde artık birçok firma ve geliştiricinin standart olarak belirlediği modern C++ yani 2011 standartları ve sonrası hem kullanımının artması hem de verim bazlı kullanımında oldukça etkili olmuştur. Buradaki verim ise dilin sağladığı araçlar ile kodun verimli çalışarak makine dilinde daha hızlı ve kolay optimize edilebilecek hale getirilmesidir. Aynı işin daha az komut ile yapılabilmesine olanak sağlaması diyebiliriz.

Bundan sonra maddeler halinde farklılıklar kısa kodlar altında açıklanarak sıralanacaktır. Unutulmamalıdır ki bu tarz yazılar edinilen bilgi birikimi ile oluşturulup okuyucuları araştırmaya daha fazlasını öğrenmeye teşvik amaçlıdır.

Her kodumuz dokunduğu her sistemle dünyamızı daha yaşanabilir hale getirsin, C++ ve kardeşleri de bunların aracısı olsun...


'c' data type

1. C programlama dilinde int,

2. C++ dilinde ise char türü olarak değerlendirilmektedir.

"auto" kullanımı

1.C programlama dilinde değişkenin blok içerisinde otomatik tür olduğunu ifade etmek için kullanılır. 2.C++ dilinde ise en çok kullanılan anahtar sözcüktür(keyword). Detayları ilerleyen yazılarda tür belirleyicileri(type deduction) başlığı altında anlatılacaktır.

"const" keyword ve linkage özelliği

1.C programlama dilinde global değişkenlerin const olması linkage özelliğini değiştirmez(extern edilebilir bir ifadedir). Diğer modüller bu değişkeni isimleri ile kullanabilirler. 2.C ++ dilinde ise internal linkage kapsamında değerlendirilir.

void* türünden T* türüne dönüşüm
#include <cstdlib>
#include <cstdio>

int main()
{
    T* pd = malloc(10 * sizeof(T));
}
*****************************    
AÇIKLAMA : T int gibi ilkel(primitive) türlerden biri olabilir.
Bu kod C programlama dilinde geçerli, C++ programlama dilinde söz dizimi hatasıdır(syntax error).
*****************************   
T türünden T* türüne dönüşüm
#include <cstdio>

int main()
{
    int val = 5;
    int* cptr = val;
}
*****************************    
AÇIKLAMA : Bu kod C programlama dilinde geçerlidir ancak uyarı(warning) verilecektir.
C++ dilinde ise doğrudan syntax error.
*****************************   
T* türünden U* türüne dönüşüm
#include <cstdio>

int main()
{
    int val = 5;
    double* dptr = &val;
}
*****************************    
AÇIKLAMA : Bu kod C programlama dilinde geçerlidir ancak uyarı(warning) verilecektir.
C++ dilinde ise doğrudan syntax error.
*****************************   
const T* türünden T* türüne dönüşüm
#include <cstdio>

int main()
{
    const int val = 5;
    int* cptr = &val;
}
*****************************    
AÇIKLAMA : Bu kod C programlama dilinde geçerlidir ancak uyarı(warning) verilecektir.
C++ dilinde ise doğrudan syntax error.
*****************************  
T* türünden void* türüne dönüşüm
#include <cstdio>

int main()
{
    int val = 5;
    void* cptr = &val;
}
*****************************    
AÇIKLAMA : Bu tür dönüşümü her iki dilde de geçerlidir.
*****************************  
"const" nesne ilk değer verme
int main ()
{
    const int x;
}
*****************************    
AÇIKLAMA : const nesneye ilk değer vermemek C++ dilinde syntax error, C dilinde geçerlidir ve tanımsız davranışa yol açar.
Burada dikkat edilmesi gereken bir nokta pointer değişkenlerde low-level ve high-level const durumlarındaki farklılık önemlidir.
*****************************  

int main ()
{
    const int* ptr;  
}
*****************************    
AÇIKLAMA : geçerli bir durumdur. (low level const)
*****************************  

int main ()
{
    int* const ptr;  
}
*****************************    
AÇIKLAMA : syntax error durumudur. (high level const)
***************************** 
değişken boyutlu(variable-sized) nesne ilk değer verme
int main()
{
    int val = 10;

    int arr[val] = { 0 };
}
*****************************    
AÇIKLAMA : C programlama dilinde syntax error, C++ dilinde geçerlidir.
***************************** 
non-constant nesne ilk değer verme
int func()
{
    return 1;
}

int val = func();

int main()
{
    return 0;
}
*****************************    
AÇIKLAMA : C programlama dilinde syntax error, C++ dilinde geçerlidir.
***************************** 
Bildirim(declaration) farklılıkları
void func(x, y, z);       

int main ()
{
    return 0;
}
*****************************    
AÇIKLAMA : C dilinde hala old-style function definiton geçerlidir.
C99 ile dilden kaldırılıp syntax error yapılmasına rağmen geçmişe uyumluluk için derleyiciler hata vermez, sadece uyarı verirler.
C++ dilinde doğrudan syntax error.
***************************** 
void func();
void vfunc(void);

int main()
{
    func(1, 2);
    vfunc(1, 2);

    return 0;
}
*****************************    
AÇIKLAMA : C dilinin kurallarına göre bir fonksiyonun bildiriminde ya da tanımında parametre parantezinin içini boş bırakırsak bu fonksiyonun parametre değişkenine sahip olmadığını değil bu konuda bilgi verilmediği gösterilir.
void yazarsak parametresi yok denir.
C dilinde func(1, 2) çağrısı legaldir, vfunc(1, 2) çağrısı syntax error. C++ dilinde ise syntax error(too many arguments to function). C++ dilinde void yazmak ve yazmamak aynı anlamdadır.
***************************** 
Aritmetik türlerden enum türlere otomatik dönüşüm
enum Button{ Off, On, Standby };
enum Animal{ Cat, Dog, Bird };

void func(int val)
{
    enum Button bt = val;   
     
    enum Animal anml = bt;    // C dilinde geçerli, C++ dilinde syntax error.
    enum Animal anml1 = Cat;  // C dilinde geçerli, C++ dilinde syntax error.
    int temp = bt;            // C dilinde de C++ dilinde de syntax error.
}
*****************************    
AÇIKLAMA : C dilinde diğer aritmetik türlerden enum türlere otomatik dönüşüm vardır. C++ dilinde syntax error.
C dilinde farklı enum türleri arasında tür dönüşümü de vardır. C++ geçerli değildir.
***************************** 
bool keyword
int main()
{
    bool flag = true;
}
*****************************    
AÇIKLAMA : C++ dilinde ve c99 standartları ile C dilinde de bool bir keyword olarak ele alınır.
Ancak c99 standartlarında true ve false hala keyword değildir. 
Bunun için stdbool.h eklenmelidir. 
C++ dilinde doğrudan kullanılabilmekte ve unsigned int olarak değerlendirilmektedir.
Karşılaştırma operatörleri ve logic operatörler; C dilinde int türden,  C++ dilinde ise bool türden değer üretir.
Diğer aritmetik türler ile bool tür arasında otomatik tür dönüşümü vardır.
bool türden pointer türüne otomatik dönüşüm yoktur.
pointer türden bool türüne otomatik dönüşüm vardır.(işlev adresi ya da nesne adresi olan adresler "true" değerine NULL pointer olan adresler "false" değerine dönüşür)
***************************** 
int main()
{
    bool fval = false;
    int val = fval;        
}
*****************************    
AÇIKLAMA : C dilinde syntax error, C++ dilinde geçerlidir.
***************************** 
string literals
  1. C dilinde string literalleri salt okunur olmasına karşın C derleyicileri tarafından türü char olan diziler olarak ele alınırlar.

  2. C++ dilinde ise string literals öğeleri const char dizilerdir.


enum type

  1. C++ dilinde enum türlerinde underline type programcı tarafından seçilebilir.

  2. Modern C++ ile dile eklenen enum class bu ayrımı daha belirgin ve kullanışlı hale getirmektedir. (enum Fruit : unsigned char{ Orange, Apple });

  3. C dilinde enum türleri ve aritmetik türler arasında otomatik tür dönüşümü geçerlidir ancak C++ dilinde syntax error olarak değerlendirilir.

  4. Enum türlerden aritmetik türlere dönüşüm C ve C++ dillerinde geçerlidir.


for döngüsü(for loop)
int main()
{
    for (int idx = 0; idx < 10; ++idx)
    {
        int idx = 12;                 
        printf("%d : ", idx);
    }
}
*****************************    
AÇIKLAMA : compiler int idx = 12; için adeta yeni scope yazar.
int idx = 12; satırı C++ dili için geçersizdir. redecleration olarak syntax error alınır.
C dilinde bu kod geçerlidir ve 10 defa 12 değeri yazdırılacaktır.
***************************** 

for (int idx = 0; idx < 10; ++idx)
{
    { 
        int idx = 12;
    }
}
char array
int main()
{
    char str[12] = "SmartCoding";
}
*****************************    
AÇIKLAMA : Bu bildirim C dilinde geçerli, C++ dilinde geçersiz ve char türden bir dizi yani arraydir.
***************************** 
int main()
{
    char* str = "SmartCoding";
}
*****************************    
AÇIKLAMA : C++ dilinde run-time hatası olarak değerlendirilen ve dikkat edilmesi gereken temel kuraldır.
***************************** 
user defined type(enum, struct, union) tanımlanmasında tür tanımı
struct Smart {
    int cpp;
};

int main()
{
    Smart val;        
}
*****************************    
AÇIKLAMA : C dilinde geçersizdir çünkü typedef bildirimi gerekir. 
C++ dilinde geçerlidir.
***************************** 
const ve static sözcüklerinin pointer parametre değişkenleriyle kullanımı
// int coding(const int* ptr); burada pointer const olur.
void coding(int ptr[const]);

// uzunluğu en az 10 olan bir yazı adresi beklenir.
void smart(char str[static 10]);

int main()
{
    return 0;
}
*****************************    
AÇIKLAMA : Yukarıdaki fonksiyonlar C dilinde geçerli C++ dilinde syntax error
***************************** 
file scope ve nesne tanımlama
  1. C dilinde file scope (global alanda) içinde bir nesne birden fazla kez tanımlanabilir. Bu durumda tanımlanan aynı nesnelerdir.

  2. C++ dilinde ise redefinition olarak syntax error.

int val, val, val, val;
int val;

int main()
{
    return 0;
}
const veya static birden fazla kez kullanımı
int main()
{
    const const const int x = 5;
    
    return 0;
}
*****************************    
AÇIKLAMA : C dilinde const ve static birden fazla kez kullanılabilir ve derleyici bunu değerlendirmez.
C++ dilinde ise syntax error. const duplicate olarak hata mesajı alınacaktır.
***************************** 
value initialize
int main ()
{
    int x{};         
}
*****************************    
AÇIKLAMA : değişkenler sıfır değeriyle, pointer ise nullptr ile hayata gelir.
C dilinde geçersiz, C++ dilinde ise geçerlidir.
***************************** 
null pointer kavramı
  1. C dilinde macro ya da sıfır değeri atama ile null pointer atanır.

  2. C++ dilinde modern C++ ile nullptr anahtar sözcüğü eklendi ve herhangi bir kütüphane eklemeden kullanılabilmektedir. STL tarafında nullptr_t isimli bir empty class türündendir. nullptr türünden pointer türüne dönüşüm geçerlidir ancak diğer türlere dönüşüm geçersizdir.

using nullptr_t = decltype(nullptr);
*****************************    
AÇIKLAMA : sizeof(std::nullptr_t) is equal to sizeof(void*).
******************************
int main()
{
    int val = nullptr;
}
*****************************    
AÇIKLAMA : syntax error.
******************************
pointer ve reference kullanımı
void pswap(int* p1, int* p2)
{
    int temp = *p1;
    *p1 = *p2;
    *p1 = temp;
}

int main()
{
    int x = 5, y = 6;
    pswap(x, y);
}
*****************************    
AÇIKLAMA : pointer kullanılarak 
******************************
void rswap(int& p1, int& p2)
{
    int temp = p1;
    p1 = p2;
    p1 = temp;
}

int main()
{
    int x = 5, y = 6;
    rswap(x, y);
}
*****************************    
AÇIKLAMA : reference kullanılarak.
C++ dilinde eklenmiştir. İleriki derslerde bu reference semantic detaylı olarak ele alınacaktır.
******************************
#include <iostream>
#include<iomanip>

void xor_swap(int& x, int& y)
{
    if (&x != &y)      
    {
        x ^= y;
        y ^= x;
        x ^= y;
    }
}

int main()
{
    int sc = 4;
    int sc1 = 6;

    std::cout << "numbers : " << sc << std::setw(2) << sc1 << std::endl;

    xor_swap(sc, sc1);

    std::cout << "numbers : " << sc << std::setw(2) << sc1 << std::endl;

    return 0;
}
*****************************    
AÇIKLAMA : bitwise ile (XOR) değişken oluşturmadan bir kullanım ...
Ancaaak C++ bunun için <algorithm> başlık dosyasında std::swap fonksiyonu ile bunu daha performanslı yazmak için programcılara sunmuştur.
******************************
ree

 
 
 

Recent Posts

See All
C++ Dilinde [[nodiscard]] attribute

C++’ta [[attribute]] (öznitelik) mekanizması, kod hakkında ek bilgi sağlayarak derleyicinin uyarılar vermesine, belirli optimizasyonlar...

 
 
 
C++ Dilinde constinit

C++20'de tanıtılan önemli bir özellik `constinit`'dir; bu özellik, statik depolama süresine sahip değişkenlerin derleme zamanında...

 
 
 

Comments


bottom of page