C++

bilgipedi.com.tr sitesinden
C++
ISO C++ Logo.svg
C++ standartlar komitesi tarafından onaylanan logo
ParadigmalarÇoklu paradigma: prosedürel, zorunlu, işlevsel, nesne yönelimli, genel, modüler
AileC
Tarafından tasarlandıBjarne Stroustrup
GeliştiriciISO/IEC JTC 1 (Joint Technical Committee 1) / SC 22 (Subcommittee 22) / WG 21 (Working Group 21)
İlk ortaya çıktı1985; 38 yıl önce
Kararlı sürüm
C++20 (ISO/IEC 14882:2020) / 15 Aralık 2020; 2 yıl önce
Önizleme sürümü
C++23 / 17 Mart 2022; 11 ay önce
Yazma disipliniStatik, nominatif, kısmen çıkarımsal
İŞLETIM SISTEMIÇapraz platform
Dosya adı uzantıları.C, .cc, .cpp, .cxx, .c++, .h, .H, .hh, .hpp, .hxx, .h++
Başlıca uygulamalar
GCC, LLVM Clang, Microsoft Visual C++, Embarcadero C++Builder, Intel C++ Derleyici, IBM XL C++, EDG
Etkilendiği
Ada, ALGOL 68, BCPL, C, CLU, ML, Mesa, Modula-2, Simula, Smalltalk
Etkilenmiş
Ada 95, C#, C99, Chapel, Clojure, D, Java, JS++, Lua, Nim, Objective-C++, Perl, PHP, Python, Rust, Seed7
  • Vikikitap'ta C++ Programlama

C++ (/ˌsˌplʌsˈplʌs/) Danimarkalı bilgisayar bilimcisi Bjarne Stroustrup tarafından C programlama dilinin bir uzantısı olarak oluşturulan genel amaçlı bir programlama dilidir veya "Sınıflı C". Dil zaman içinde önemli ölçüde genişlemiştir ve modern C++ artık düşük seviyeli bellek manipülasyonu için olanaklara ek olarak nesne yönelimli, genel ve işlevsel özelliklere sahiptir. Neredeyse her zaman derlenmiş bir dil olarak uygulanır ve Özgür Yazılım Vakfı, LLVM, Microsoft, Intel, Oracle ve IBM dahil olmak üzere birçok satıcı C++ derleyicileri sağlar, bu nedenle birçok platformda kullanılabilir.

C++, sistem programlama ve gömülü, kaynak kısıtlı yazılım ve büyük sistemlere yönelik olarak tasarlanmıştır ve tasarımında performans, verimlilik ve kullanım esnekliği öne çıkmaktadır. C++, masaüstü uygulamaları, video oyunları, sunucular (örneğin e-ticaret, web araması veya veritabanları) ve performans açısından kritik uygulamalar (örneğin telefon anahtarları veya uzay sondaları) dahil olmak üzere yazılım altyapısı ve kaynak kısıtlı uygulamalar gibi temel güçlü yönleriyle diğer birçok bağlamda da yararlı bulunmuştur.

C++, Uluslararası Standardizasyon Örgütü (ISO) tarafından standartlaştırılmıştır ve en son standart sürümü ISO tarafından Aralık 2020'de ISO/IEC 14882:2020 (gayri resmi olarak C++20 olarak bilinir) olarak onaylanmış ve yayınlanmıştır. C++ programlama dili ilk olarak 1998 yılında ISO/IEC 14882:1998 olarak standartlaştırılmış ve daha sonra C++03, C++11, C++14 ve C++17 standartları ile değiştirilmiştir. Mevcut C++20 standardı, yeni özellikler ve genişletilmiş bir standart kütüphane ile bunların yerini almaktadır. 1998'deki ilk standartlaştırmadan önce, C++, 1979'dan beri Bell Labs'da Stroustrup tarafından C dilinin bir uzantısı olarak geliştirildi; program organizasyonu için üst düzey özellikler de sağlayan C'ye benzer verimli ve esnek bir dil istiyordu. C++, 2012'den bu yana üç yıllık bir sürüm takvimine sahiptir ve bir sonraki planlanan standart C++23'tür.

C++ (Türkçe okunuşu: ce artı artı, İngilizce okunuşu: si plas plas), Bell Laboratuvarlarından Bjarne Stroustrup tarafından 1979 yılından itibaren geliştirilmeye başlanmış, C'yi kapsayan ve çok paradigmalı, yaygın olarak kullanılan, genel amaçlı bir programlama dilidir. İlk olarak C With Classes (Sınıflarla C) olarak adlandırılmış, 1983 yılında ismi C++ olarak değiştirilmiştir.

Genel olarak her C programı aynı zamanda bir C++ programıdır, ancak her C++ programı bir C programı değildir. Bu durumun bazı istisnaları mevcuttur. C++'ı C'den ayıran özellikler C++'ın nesne paradigması kullanılarak programlamaya olanak tanıyan özelliklerdir. Sınıflar sayesinde yeni veri türleri yaratılabilir veya varolan türlerden yenileri türetilebilir. Ayrıca çokbiçimlilik sayesinde bir sınıf tanımıyla yazılmış kod, o sınıf türünden türetilmiş yeni sınıflarla da çalışabilir.

Tarihçe

C++'ın yaratıcısı Bjarne Stroustrup, AT&T New Jersey ofisinde, 2000 yılı civarında

1979 yılında Danimarkalı bir bilgisayar bilimcisi olan Bjarne Stroustrup, C++'ın öncülü olan "C with Classes" üzerinde çalışmaya başladı. Yeni bir dil yaratma motivasyonu, Stroustrup'un doktora tezi için programlama deneyiminden kaynaklanıyordu. Stroustrup, Simula'nın büyük yazılım geliştirme için çok yararlı özelliklere sahip olduğunu, ancak dilin pratik kullanım için çok yavaş olduğunu, BCPL'nin ise hızlı ancak büyük yazılım geliştirme için uygun olamayacak kadar düşük seviyeli olduğunu fark etti. Stroustrup AT&T Bell Labs'de çalışmaya başladığında UNIX çekirdeğini dağıtık hesaplama açısından analiz etme sorunuyla karşılaştı. Doktora deneyimini hatırlayan Stroustrup, C dilini Simula benzeri özelliklerle geliştirmeye koyuldu. C dilinin seçilmesinin nedeni genel amaçlı, hızlı, taşınabilir ve yaygın olarak kullanılıyor olmasıydı. C ve Simula'nın etkilerinin yanı sıra ALGOL 68, Ada, CLU ve ML gibi diğer diller de bu yeni dili etkiledi.

Başlangıçta, Stroustrup'un "Sınıflı C "si C derleyicisi Cpre'ye sınıflar, türetilmiş sınıflar, güçlü yazım, inlining ve varsayılan argümanlar gibi özellikler ekledi.

2015'te Paris'te C++11 özellikleri üzerine bir sınav yapıldı

1982 yılında Stroustrup, "C++" adını verdiği Sınıflar ile C'nin bir halefini geliştirmeye başladı (++ C'deki artırma operatörüdür) birkaç başka isimden geçtikten sonra. Sanal fonksiyonlar, fonksiyon adı ve operatör aşırı yükleme, referanslar, sabitler, tip güvenli serbest depo bellek ayırma (new/delete), geliştirilmiş tip denetimi ve BCPL tarzı iki ileri eğik çizgi içeren tek satırlı yorumlar (//). Ayrıca, Stroustrup C++ için yeni, bağımsız bir derleyici olan Cfront'u geliştirmiştir.

1984 yılında Stroustrup ilk akış giriş/çıkış kütüphanesini hayata geçirdi. Adlandırılmış bir çıktı fonksiyonu yerine bir çıktı operatörü sağlama fikri Doug McIlroy (daha önce Unix borularını önermişti) tarafından önerildi.

1985 yılında, henüz resmi bir standart olmadığı için dil için kesin referans haline gelen The C++ Programming Language'in ilk baskısı yayınlandı. C++'ın ilk ticari uygulaması aynı yılın Ekim ayında piyasaya sürüldü.

1989 yılında C++ 2.0 piyasaya sürüldü ve bunu 1991 yılında C++ Programlama Dili'nin güncellenmiş ikinci baskısı izledi. 2.0'daki yeni özellikler arasında çoklu miras, soyut sınıflar, statik üye fonksiyonları, const üye fonksiyonları ve korumalı üyeler yer alıyordu. 1990 yılında The Annotated C++ Reference Manual yayımlandı. Bu çalışma gelecekteki standardın temeli oldu. Daha sonra eklenen özellikler arasında şablonlar, istisnalar, isim alanları, yeni dökümler ve bir Boolean türü yer aldı.

1998 yılında dili standartlaştıran C++98 yayınlandı ve 2003 yılında küçük bir güncelleme (C++03) yayınlandı.

C++98'den sonra C++, 2011'de C++11 standardı yayınlanana, çok sayıda yeni özellik eklenene, standart kütüphaneyi daha da genişletene ve C++ programcılarına daha fazla olanak sağlayana kadar nispeten yavaş gelişti. Aralık 2014'te yayınlanan küçük bir C++14 güncellemesinden sonra, C++17'de çeşitli yeni eklemeler yapıldı. Şubat 2020'de son halini aldıktan sonra, C++20 standardının bir taslağı 4 Eylül 2020'de onaylandı ve 15 Aralık 2020'de resmi olarak yayınlandı.

3 Ocak 2018'de Stroustrup, "C++ programlama dilini kavramsallaştırdığı ve geliştirdiği için" Charles Stark Draper Mühendislik Ödülü'nün 2018 kazananı olarak ilan edildi.

2022 itibariyle C++, programlama dillerinin popülerliğinin bir ölçüsü olan TIOBE endeksinde Python, C ve Java'dan sonra dördüncü sırada yer almaktadır.

Etimoloji

Stroustrup'a göre, "bu isim C'deki değişikliklerin evrimsel doğasını ifade etmektedir". Bu isim Rick Mascitti'ye (1983 ortası) atfedilir ve ilk olarak Aralık 1983'te kullanılmıştır. Mascitti'ye 1992 yılında gayri resmi olarak isimlendirme hakkında soru sorulduğunda, bu ismin şakacı bir ruh haliyle verildiğini belirtmiştir. İsim C'den gelmektedir ++ operatörü (bir değişkenin değerini artırır) ve geliştirilmiş bir bilgisayar programını belirtmek için "+" kullanmanın ortak bir adlandırma kuralı.

C++'ın geliştirme döneminde, dil son adını almadan önce "yeni C" ve "Sınıflı C" olarak anılmıştır.

Felsefe

C++'ın yaşamı boyunca, gelişimi ve evrimi bir dizi ilke tarafından yönlendirilmiştir:

  • Gerçek problemler tarafından yönlendirilmeli ve özellikleri gerçek dünya programlarında hemen kullanışlı olmalıdır.
  • Her özellik uygulanabilir olmalıdır (bunu yapmanın makul derecede açık bir yolu ile).
  • Programcılar kendi programlama stillerini seçmekte özgür olmalı ve bu stil C++ tarafından tam olarak desteklenmelidir.
  • Yararlı bir özelliğe izin vermek, C++'ın olası her türlü yanlış kullanımını önlemekten daha önemlidir.
  • Programları ayrı, iyi tanımlanmış parçalar halinde düzenlemek için olanaklar sağlamalı ve ayrı olarak geliştirilmiş parçaları birleştirmek için olanaklar sağlamalıdır.
  • Tip sisteminin örtük olarak ihlal edilmemesi (ancak açık ihlallere, yani programcı tarafından açıkça talep edilenlere izin verilmesi).
  • Kullanıcı tarafından oluşturulan tiplerin yerleşik tiplerle aynı destek ve performansa sahip olması gerekir.
  • Kullanılmayan özellikler oluşturulan çalıştırılabilir dosyaları olumsuz etkilememelidir (örneğin daha düşük performans).
  • C++'ın altında bir dil olmamalıdır (assembly dili hariç).
  • C++, kendi ayrı ve uyumsuz programlama ortamını teşvik etmek yerine mevcut diğer programlama dilleriyle birlikte çalışmalıdır.
  • Programcının amacı bilinmiyorsa, manuel kontrol sağlayarak programcının bunu belirtmesine izin verin.

Standartlaştırma

1996'da Stockholm'deki C++ standartları komitesi toplantısı sırasında bir sahne
C++ standartları
Yıl C++ Standardı Resmi olmayan isim
1998 ISO/IEC 14882:1998 C++98
2003 ISO/IEC 14882:2003 C++03
2011 ISO/IEC 14882:2011 C++11, C++0x
2014 ISO/IEC 14882:2014 C++14, C++1y
2017 ISO/IEC 14882:2017 C++17, C++1z
2020 ISO/IEC 14882:2020 C++20, C++2a

C++, JTC1/SC22/WG21 olarak bilinen bir ISO çalışma grubu tarafından standartlaştırılmıştır. Şimdiye kadar C++ standardının altı revizyonunu yayınlamıştır ve şu anda bir sonraki revizyon olan C++23 üzerinde çalışmaktadır.

1998 yılında, ISO çalışma grubu C++'ı ilk kez ISO/IEC 14882:1998 olarak standartlaştırdı ve bu standart gayri resmi olarak C++98 olarak bilinmektedir. 2003 yılında, C++98'de tespit edilen sorunları gideren ISO/IEC 14882:2003 adlı C++ standardının yeni bir sürümünü yayınladı.

Standardın bir sonraki büyük revizyonu gayri resmi olarak "C++0x" olarak adlandırıldı, ancak 2011 yılına kadar yayınlanmadı. C++11 (14882:2011) hem çekirdek dile hem de standart kütüphaneye birçok ekleme içeriyordu.

2014 yılında, C++14 (C++1y olarak da bilinir), C++11'in küçük bir uzantısı olarak piyasaya sürüldü ve çoğunlukla hata düzeltmeleri ve küçük iyileştirmeler içeriyordu. Taslak Uluslararası Standart oylama prosedürleri Ağustos 2014 ortasında tamamlanmıştır.

C++14'ten sonra, gayri resmi olarak C++1z olarak bilinen büyük revizyon C++17, Temmuz 2017'nin ortalarında ISO C++ komitesi tarafından tamamlandı ve Aralık 2017'de onaylanarak yayınlandı.

ISO, standardizasyon sürecinin bir parçası olarak teknik raporlar ve spesifikasyonlar da yayınlamaktadır:

  • ISO/IEC TR 18015:2006, gömülü sistemlerde C++ kullanımı ve C++ dil ve kütüphane özelliklerinin performans etkileri üzerine,
  • ISO/IEC TR 19768:2007 (C++ Teknik Raporu 1 olarak da bilinir) çoğunlukla C++11'e entegre edilmiş kütüphane uzantıları hakkında,
  • Özel matematiksel fonksiyonlar hakkında ISO/IEC TR 29124:2010, C++17'ye entegre edilmiştir
  • ISO/IEC TR 24733:2011 ondalık kayan nokta aritmetiği,
  • ISO/IEC TS 18822:2015 standart dosya sistemi kütüphanesi, C++17'ye entegre edilmiştir
  • ISO/IEC TS 19570:2015, C++17'ye entegre edilmiş standart kütüphane algoritmalarının paralel versiyonları hakkında
  • Yazılım işlem belleği üzerine ISO/IEC TS 19841:2015,
  • ISO/IEC TS 19568:2015, bazıları halihazırda C++17'ye entegre edilmiş olan yeni bir kütüphane uzantıları seti üzerine,
  • C++ kavramları üzerine ISO/IEC TS 19217:2015, C++20'ye entegre edilmiştir
  • ISO/IEC TS 19571:2016, bazıları halihazırda C++'a entegre edilmiş olan eşzamanlılık için kütüphane uzantıları hakkında20
  • ISO/IEC TS 19568:2017 yeni bir genel amaçlı kütüphane uzantıları seti hakkında
  • ISO/IEC TS 21425:2017, C++20'ye entegre edilmiş aralıklar için kütüphane uzantıları hakkında
  • ISO/IEC TS 22277:2017, C++20'ye entegre edilmiş korutinler hakkında
  • ISO/IEC TS 19216:2018 ağ kütüphanesi hakkında
  • Modüller hakkında ISO/IEC TS 21544:2018, C++20'ye entegre edilmiştir
  • ISO/IEC TS 19570:2018 paralellik için yeni bir dizi kütüphane uzantısı hakkında
  • ISO/IEC TS 23619:2021 yansıma için yeni bir uzantı hakkında

Yeni eşzamanlılık uzantıları seti de dahil olmak üzere daha fazla teknik şartname geliştirilmekte ve onay beklemektedir.

Dil

C++ dilinin iki ana bileşeni vardır: öncelikle C alt kümesi tarafından sağlanan donanım özelliklerinin doğrudan eşleştirilmesi ve bu eşleştirmelere dayalı sıfır genel soyutlamalar. Stroustrup C++'ı "verimli ve zarif soyutlamalar oluşturmak ve kullanmak için [tasarlanmış] hafif bir soyutlama programlama dili" olarak tanımlamaktadır; ve "hem donanım erişimi hem de soyutlama sunmak C++'ın temelidir. Bunu verimli bir şekilde yapmak, onu diğer dillerden ayıran şeydir."

C++, C'nin sözdiziminin çoğunu miras almıştır. Aşağıda Bjarne Stroustrup'un Hello world programının standart çıktıya bir mesaj yazmak için C++ Standart Kütüphanesi stream özelliğini kullanan versiyonu yer almaktadır:

#include <iostream> <span title="Kaynak: İngilizce Vikipedi, Bölüm &quot;Language&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/C++#Language <span style="color:#dddddd">ⓘ</span>]</span>

int main()
{
    std::cout << "Merhaba, dünya!\n";
}

Merhaba dunya C++ programının terminal çıktısı.

Bu program terminal ekranına "Merhaba, dunya!" yazacaktır.

#include <iostream> <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;Merhaba Dünya&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#Merhaba_Dünya <span style="color:#dddddd">ⓘ</span>]</span>

Nesne depolama

C'de olduğu gibi, C++ dört tür bellek yönetimini destekler: statik depolama süresi nesneleri, iş parçacığı depolama süresi nesneleri, otomatik depolama süresi nesneleri ve dinamik depolama süresi nesneleri.

Statik depolama süresi nesneleri

Statik depolama süresi nesneleri main() işlevine girilmeden önce oluşturulur (aşağıdaki istisnalara bakın) ve main() işlevinden çıkıldıktan sonra oluşturulma sırasının tersine yok edilir. Oluşturulma sırası standart tarafından tam olarak belirtilmemiştir (ancak aşağıda tanımlanan bazı kurallar vardır), böylece uygulamacılara uygulamalarını nasıl düzenleyecekleri konusunda biraz özgürlük tanınmıştır. Daha resmi olarak, bu tür nesnelerin "program süresince devam edecek" bir ömrü vardır.

Statik depolama süresi nesneleri iki aşamada başlatılır. İlk olarak "statik başlatma" gerçekleştirilir ve ancak tüm statik başlatma gerçekleştirildikten sonra "dinamik başlatma" gerçekleştirilir. Statik ilklendirmede, tüm nesneler ilk olarak sıfır ile ilklendirilir; bundan sonra, sabit ilklendirme aşamasına sahip tüm nesneler sabit ifade ile ilklendirilir (yani, bir literal veya constexpr ile ilklendirilen değişkenler). Standartta belirtilmemesine rağmen, statik ilklendirme aşaması derleme zamanında tamamlanabilir ve çalıştırılabilir dosyanın veri bölümüne kaydedilebilir. Dinamik ilklendirme, bir kurucu veya fonksiyon çağrısı yoluyla yapılan tüm nesne ilklendirmelerini içerir (C++11'de fonksiyon constexpr ile işaretlenmediği sürece). Dinamik ilklendirme sırası, derleme birimi (yani aynı dosya) içindeki bildirim sırası olarak tanımlanır. Derleme birimleri arasındaki başlatma sırası hakkında hiçbir garanti verilmez.

İş parçacığı depolama süresi nesneleri

Bu tür değişkenler statik depolama süresi nesnelerine çok benzer. Temel fark, oluşturma zamanının iş parçacığı oluşturulmadan hemen önce olması ve yok etme işleminin iş parçacığı birleştirildikten sonra yapılmasıdır.

Otomatik depolama süresi nesneleri

C++'da en yaygın değişken türleri, bir fonksiyon veya blok içindeki yerel değişkenler ve geçici değişkenlerdir. Otomatik değişkenlerle ilgili ortak özellik, değişkenin kapsamıyla sınırlı bir yaşam süresine sahip olmalarıdır. Bildirim noktasında oluşturulur ve potansiyel olarak ilklendirilirler (ayrıntılar için aşağıya bakın) ve kapsam terk edildiğinde oluşturulma sırasının tersine yok edilirler. Bu, yığın üzerinde tahsis ile gerçekleştirilir.

Yerel değişkenler, yürütme noktası bildirim noktasını geçtikçe oluşturulur. Değişkenin bir kurucusu veya başlatıcısı varsa, bu nesnenin başlangıç durumunu tanımlamak için kullanılır. Yerel değişkenler, içinde bildirildikleri yerel blok veya işlev kapatıldığında yok edilir. Yerel değişkenler için C++ yıkıcıları nesne ömrünün sonunda çağrılır ve C++'da yaygın olarak kullanılan RAII adı verilen otomatik kaynak yönetimi disiplinine olanak tanır.

Üye değişkenler, ana nesne oluşturulduğunda yaratılır. Dizi üyeleri 0'dan dizinin son üyesine kadar sırayla başlatılır. Üye değişkenler, ana nesne yok edildiğinde, oluşturulma sırasının tersine yok edilir. Yani, ana nesne bir "otomatik nesne" ise, kapsam dışına çıktığında yok edilir ve bu da tüm üyelerinin yok edilmesini tetikler.

Geçici değişkenler ifade değerlendirmesinin sonucu olarak oluşturulur ve ifadeyi içeren deyim tamamen değerlendirildiğinde (genellikle bir deyimin sonundaki ; işaretinde) yok edilir.

Dinamik depolama süresi nesneleri

Bu nesnelerin dinamik bir ömrü vardır ve doğrudan bir çağrı ile oluşturulabilir. yeni 'e yapılan bir çağrı ile açıkça yok edilir. silme. C++ ayrıca C'den malloc ve free'yi de destekler, ancak bunlar C++ ile uyumlu değildir. yeni ve silme. Kullanımı yeni ayrılmış belleğe bir adres döndürür. C++ Çekirdek Yönergeleri aşağıdakilerin kullanılmamasını tavsiye eder yeni aracılığıyla akıllı işaretçiler lehine dinamik nesneler oluşturmak için doğrudan make_unique<T> tek mülkiyet için ve make_shared<T> C++11'de tanıtılan referans sayımlı çoklu sahiplik için.

Şablonlar

C++ şablonları genel programlamayı mümkün kılar. C++ fonksiyon, sınıf, takma ad ve değişken şablonlarını destekler. Şablonlar türler, derleme zamanı sabitleri ve diğer şablonlar tarafından parametrelendirilebilir. Şablonlar derleme zamanında örnekleme yoluyla uygulanır. Bir şablonu örneklemek için derleyiciler, somut bir işlev veya sınıf örneği oluşturmak üzere şablonun parametreleri yerine belirli argümanları koyar. Bazı ikameler mümkün değildir; bunlar "İkame hatası bir hata değildir" (SFINAE) ifadesiyle tanımlanan bir aşırı yük çözümleme politikası ile ortadan kaldırılır. Şablonlar genel programlama, şablon metaprogramlama ve kod optimizasyonu için kullanılabilecek güçlü bir araçtır, ancak bu güç bir maliyet anlamına gelir. Şablon kullanımı kod boyutunu artırabilir, çünkü her şablon örneklemesi şablon kodunun bir kopyasını üretir: her şablon argümanı kümesi için bir tane, ancak bu, kod elle yazılmış olsaydı üretilecek kodla aynı veya daha az miktardadır. Bu, derleme zamanında tipin silindiği ve tek bir şablon gövdesinin korunduğu diğer dillerde (örneğin Java) görülen çalışma zamanı jeneriklerinin aksine bir durumdur.

Şablonlar makrolardan farklıdır: her iki derleme zamanı dil özelliği de koşullu derlemeyi mümkün kılarken, şablonlar sözcüksel ikame ile sınırlı değildir. Şablonlar, eşlik ettikleri dilin semantiği ve tip sisteminin yanı sıra tüm derleme zamanı tip tanımlarının farkındadır ve sıkı tip kontrollü parametrelerin değerlendirilmesine dayalı programatik akış kontrolü dahil olmak üzere üst düzey işlemler gerçekleştirebilir. Makrolar önceden belirlenmiş kriterlere dayalı olarak derleme üzerinde koşullu kontrol yeteneğine sahiptir, ancak yeni tipler oluşturamaz, özyineleme yapamaz veya tip değerlendirmesi gerçekleştiremez ve aslında derleme öncesi metin ikamesi ve metin dahil etme/dışlama ile sınırlıdır. Başka bir deyişle, makrolar önceden tanımlanmış sembollere dayalı olarak derleme akışını kontrol edebilir, ancak şablonların aksine bağımsız olarak yeni semboller oluşturamaz. Şablonlar statik çok biçimlilik (aşağıya bakınız) ve genel programlama için bir araçtır.

Buna ek olarak, şablonlar C++'da Turing-complete olan bir derleme zamanı mekanizmasıdır, yani bir bilgisayar programı tarafından ifade edilebilen herhangi bir hesaplama, çalışma zamanından önce bir şablon metaprogramı tarafından bir şekilde hesaplanabilir.

Özetle, bir şablon, örneklendirmek için kullanılan belirli argümanlar hakkında bilgi sahibi olmadan yazılan derleme zamanı parametrelendirilmiş bir işlev veya sınıftır. Örneklemeden sonra, ortaya çıkan kod, iletilen argümanlar için özel olarak yazılmış koda eşdeğerdir. Bu şekilde şablonlar, soyutlama nedeniyle performanstan ödün vermeden işlevlerin ve sınıfların genel, geniş uygulanabilir yönlerini (şablonlarda kodlanmış) belirli yönlerden (şablon parametrelerinde kodlanmış) ayırmanın bir yolunu sağlar.

Nesneler

C++, C'ye nesne yönelimli programlama (OOP) özelliklerini getirmektedir. OOP (ve bazı OOP olmayan) dillerde yaygın olarak bulunan dört özelliği sağlayan sınıflar sunmaktadır: soyutlama, kapsülleme, kalıtım ve çok biçimlilik. C++ sınıflarının diğer programlama dillerindeki sınıflara kıyasla ayırt edici bir özelliği, deterministik yıkıcıları desteklemesidir ve bu da Kaynak Edinimi Başlatma (RAII) kavramına destek sağlar.

Kapsülleme

Kapsülleme, veri yapılarının ve operatörlerin amaçlandığı gibi kullanılmasını sağlamak ve kullanım modelini geliştirici için daha belirgin hale getirmek için bilginin gizlenmesidir. C++, birincil kapsülleme mekanizmaları olarak sınıfları ve fonksiyonları tanımlama olanağı sağlar. Bir sınıf içinde üyeler, kapsüllemeyi açıkça uygulamak için public, protected ya da private olarak bildirilebilir. Sınıfın public bir üyesine tüm fonksiyonlar erişebilir. Özel bir üyeye yalnızca o sınıfın üyesi olan işlevler ve sınıf tarafından açıkça erişim izni verilen işlevler ve sınıflar ("arkadaşlar") erişebilir. Korumalı bir üyeye, sınıfın kendisi ve arkadaşlarına ek olarak sınıftan miras alan sınıfların üyeleri de erişebilir.

Nesne yönelimli ilke, bir türün iç temsiline erişen tüm ve yalnızca işlevlerin kapsüllenmesini sağlar. C++ bu ilkeyi üye işlevler ve arkadaş işlevler aracılığıyla destekler, ancak zorunlu kılmaz. Programcılar bir türün temsilinin bir kısmını ya da tamamını public olarak bildirebilir ve bir türün temsilinin parçası olmayan public varlıklar oluşturabilirler. Bu nedenle, C++ sadece nesne yönelimli programlamayı değil, modüler programlama gibi diğer ayrıştırma paradigmalarını da destekler.

Genellikle tüm verileri özel veya korumalı yapmak ve yalnızca sınıfın kullanıcıları için asgari bir arayüzün parçası olan işlevleri herkese açık hale getirmek iyi bir uygulama olarak kabul edilir. Bu, veri uygulamasının ayrıntılarını gizleyebilir ve tasarımcının daha sonra arayüzü herhangi bir şekilde değiştirmeden uygulamayı temelden değiştirmesine olanak tanır.

Kalıtım

Kalıtım, bir veri türünün diğer veri türlerinin özelliklerini edinmesini sağlar. Bir temel sınıftan kalıtım public, protected veya private olarak bildirilebilir. Bu erişim belirteci, ilişkisiz ve türetilmiş sınıfların temel sınıfın miras alınan public ve protected üyelerine erişip erişemeyeceğini belirler. Yalnızca public kalıtım, genellikle "kalıtım" ile kastedilene karşılık gelir. Diğer iki form çok daha az kullanılır. Erişim belirteci atlanırsa, bir "class" özel olarak miras alırken, bir "struct" genel olarak miras alır. Temel sınıflar sanal olarak bildirilebilir; buna sanal kalıtım denir. Sanal kalıtım, kalıtım grafiğinde bir temel sınıfın yalnızca bir örneğinin bulunmasını sağlayarak çoklu kalıtımın bazı belirsizlik sorunlarını önler.

Çoklu kalıtım, bir sınıfın birden fazla temel sınıftan türetilmesine izin veren bir C++ özelliğidir; bu daha ayrıntılı kalıtım ilişkilerine izin verir. Örneğin, bir "Uçan Kedi" sınıfı hem "Kedi "den hem de "Uçan Memeli "den miras alabilir. C# veya Java gibi diğer bazı diller, temel sınıfların sayısını bir ile sınırlarken birden fazla arayüzün kalıtımına izin vererek benzer bir şeyi (daha sınırlı olsa da) gerçekleştirir (arayüzler, sınıflardan farklı olarak, yalnızca üye işlevlerin bildirimlerini sağlar, uygulama veya üye verileri sağlamaz). C# ve Java'da olduğu gibi bir arayüz, C++'da yalnızca saf sanal işlevler içeren ve genellikle soyut temel sınıf veya "ABC" olarak bilinen bir sınıf olarak tanımlanabilir. Böyle bir soyut temel sınıfın üye fonksiyonları normalde türetilmiş sınıfta açıkça tanımlanır, dolaylı olarak miras alınmaz. C++ sanal kalıtım, baskınlık adı verilen bir belirsizlik çözme özelliği sergiler.

Operatörler ve operatör aşırı yükleme

Aşırı yüklenemeyen operatörler
Operatör Sembol
Kapsam çözümleme operatörü ::
Koşullu operatör ?:
nokta operatörü .
Üye seçim operatörü .*
"sizeof" operatörü boyutof
"typeid" operatörü typeid

C++, temel aritmetik, bit manipülasyonu, dolaylama, karşılaştırmalar, mantıksal işlemler ve diğerlerini kapsayan 35'ten fazla operatör sağlar. Üye erişimi (. ve .*) ve koşul operatörü gibi birkaç önemli istisna dışında neredeyse tüm operatörler kullanıcı tanımlı tipler için aşırı yüklenebilir. Aşırı yüklenebilir operatörlerin zengin seti, C++'daki kullanıcı tanımlı tiplerin yerleşik tipler gibi görünmesini sağlamanın merkezinde yer alır.

Aşırı yüklenebilir operatörler, akıllı işaretçiler gibi birçok gelişmiş C++ programlama tekniğinin de önemli bir parçasıdır. Bir işlecin aşırı yüklenmesi, işleci içeren hesaplamaların önceliğini değiştirmediği gibi işlecin kullandığı işlenen sayısını da değiştirmez (ancak herhangi bir işlenen, yürütme öncesinde değerlendirilecek olsa da işleç tarafından göz ardı edilebilir). Aşırı yüklenmiş "&&" ve "||" işleçleri kısa devre değerlendirme özelliklerini kaybederler.

Çokbiçimlilik

Çok biçimlilik, birçok uygulama için ortak bir arayüz ve nesnelerin farklı koşullar altında farklı davranmasını sağlar.

C++, yukarıda açıklanan dil özellikleri tarafından desteklenen çeşitli statik (derleme zamanında çözümlenen) ve dinamik (çalışma zamanında çözümlenen) çok biçimlilik türlerini destekler. Derleme zamanı çok biçimliliği belirli çalışma zamanı kararlarına izin vermezken, çalışma zamanı çok biçimliliği tipik olarak bir performans cezasına neden olur.

Statik çok biçimlilik

Fonksiyon aşırı yükleme, programların aynı isimde ancak farklı argümanlara sahip birden fazla fonksiyon bildirmesine olanak tanır (yani geçici çok biçimlilik). Fonksiyonlar, resmi parametrelerinin sayısı veya türleri ile ayırt edilir. Böylece, aynı fonksiyon adı kullanıldığı bağlama bağlı olarak farklı fonksiyonlara atıfta bulunabilir. İşlev tarafından döndürülen tür, aşırı yüklenmiş işlevleri ayırt etmek için kullanılmaz ve farklı dönüş türleri bir derleme zamanı hata mesajıyla sonuçlanır.

Bir fonksiyon bildirilirken, programcı bir veya daha fazla parametre için varsayılan bir değer belirtebilir. Bunu yapmak, fonksiyon çağrıldığında varsayılan değerlere sahip parametrelerin isteğe bağlı olarak atlanmasına olanak tanır; bu durumda varsayılan argümanlar kullanılır. Bir fonksiyon, bildirilen parametre sayısından daha az sayıda argümanla çağrıldığında, açık argümanlar soldan sağa sırayla parametrelerle eşleştirilir ve parametre listesinin sonundaki eşleşmeyen parametrelere varsayılan argümanları atanır. Birçok durumda, varsayılan argümanları tek bir fonksiyon bildiriminde belirtmek, farklı sayıda parametreye sahip aşırı yüklenmiş fonksiyon tanımları sağlamaya tercih edilir.

C++'daki şablonlar genel, çok biçimli kod (yani parametrik çok biçimlilik) yazmak için sofistike bir mekanizma sağlar. Özellikle, ilginç bir şekilde yinelenen şablon kalıbı aracılığıyla, sanal işlevleri geçersiz kılma sözdizimini yakından taklit eden bir statik çok biçimlilik biçimi uygulamak mümkündür. C++ şablonları tip farkındalığına sahip ve Turing-complete olduğundan, derleyicinin özyinelemeli koşulluları çözmesine ve şablon metaprogramlama yoluyla önemli programlar oluşturmasına izin vermek için de kullanılabilirler. Bazı görüşlerin aksine, şablon kodu uygun derleyici ayarlarıyla derlendikten sonra toplu bir kod oluşturmayacaktır.

Dinamik polimorfizm

Kalıtım

C++'da bir temel sınıf türüne yönelik değişken işaretçileri ve referanslar, o türden türetilmiş sınıfların nesnelerine de referans verebilir. Bu, dizilerin ve diğer kapsayıcı türlerinin farklı türlerdeki nesnelere işaretçi tutmasına olanak tanır (referanslar doğrudan kapsayıcılarda tutulamaz). Bu, atıfta bulunulan nesnelerin (gerçek, türetilmiş) türlerine bağlı olarak farklı davranabileceği dinamik (çalışma zamanı) çok biçimliliği mümkün kılar.

C++ ayrıca şu özellikleri de sağlar dynamic_cast operatörü, kodun bir temel referans/işaretçi aracılığıyla bir nesneyi daha türetilmiş bir türe güvenli bir şekilde dönüştürmeye çalışmasına olanak tanır: downcasting. Çoğu zaman hangi türetilmiş türe başvurulduğu bilinmediğinden bu girişim gereklidir. (Upcasting, daha genel bir türe dönüştürme, derleme zamanında her zaman kontrol edilebilir / gerçekleştirilebilir. static_castatasal sınıflar türetilmiş sınıfın arayüzünde belirtildiği ve tüm çağıranlar tarafından görülebildiği için) dynamic_cast Çalışma zamanı tür bilgisine (RTTI), programdaki türleri ve aralarındaki ilişkileri ayırt etmeyi sağlayan meta verilere dayanır. Eğer bir dynamic_cast bir işaretçi başarısız olursa, sonuç nullptr sabitine dönüştürülebilirken, hedef bir referans ise (null olamaz), döküm bir istisna fırlatır. Belirli bir türetilmiş türde olduğu bilinen nesneler static_cast'nin RTTI ve güvenli çalışma zamanı tür denetimini atlayarak dynamic_castBu nedenle, bu yalnızca programcı dökümün geçerli olduğundan ve her zaman geçerli olacağından çok eminse kullanılmalıdır.

Sanal üye fonksiyonlar

Normalde, türetilmiş bir sınıftaki bir işlev temel sınıftaki bir işlevi geçersiz kıldığında, çağrılacak işlev nesnenin türüne göre belirlenir. Belirli bir işlev, o işlevin iki veya daha fazla tanımı arasında parametre sayısı veya türü açısından bir fark olmadığında geçersiz kılınır. Bu nedenle, derleme zamanında, yalnızca bir temel sınıf işaretçisi verildiğinde nesnenin türünü ve dolayısıyla çağrılacak doğru işlevi belirlemek mümkün olmayabilir; bu nedenle karar çalışma zamanına kadar ertelenir. Buna dinamik gönderim denir. Sanal üye işlevler veya yöntemler, nesnenin gerçek çalışma zamanı türüne göre işlevin en özel uygulamasının çağrılmasına izin verir. C++ uygulamalarında bu genellikle sanal işlev tabloları kullanılarak yapılır. Nesne türü biliniyorsa, işlev çağrısından önce tam nitelikli bir sınıf adı eklenerek bu durum atlanabilir, ancak genel olarak sanal işlevlere yapılan çağrılar çalışma zamanında çözümlenir.

Standart üye fonksiyonlara ek olarak, operatör aşırı yüklemeleri ve yıkıcılar da sanal olabilir. Pratik deneyimlere dayanan kesin olmayan bir kurala göre, sınıftaki herhangi bir işlev sanal ise, yıkıcı da sanal olmalıdır. Bir nesnenin oluşturulduğu andaki türü derleme zamanında bilindiğinden, kurucular ve buna bağlı olarak kopya kurucular sanal olamaz. Bununla birlikte, türetilmiş bir nesneye bir işaretçi bir temel nesneye işaretçi olarak aktarıldığında bir nesnenin kopyasının oluşturulması gereken bir durum ortaya çıkabilir. Böyle bir durumda, yaygın bir çözüm bir clone() (veya benzeri) sanal işlev, çağrıldığında türetilmiş sınıfın bir kopyasını oluşturur ve döndürür.

Bir üye işlev, başına şu ekler getirilerek de "saf sanal" yapılabilir = 0 kapanış parantezinden sonra ve noktalı virgülden önce. Saf sanal işlev içeren bir sınıfa soyut sınıf denir. Nesneler soyut bir sınıftan oluşturulamaz; yalnızca türetilebilirler. Türetilen herhangi bir sınıf, sanal işlevi saf olarak devralır ve türetilen sınıfın nesneleri oluşturulmadan önce bunun (ve diğer tüm saf sanal işlevlerin) saf olmayan bir tanımını sağlamalıdır. Saf sanal üye fonksiyonu veya miras alınmış saf sanal üye fonksiyonu olan bir sınıfın nesnesini oluşturmaya çalışan bir program hatalı biçimlendirilmiştir.

Lambda ifadeleri

C++, lambda ifadeleri olarak da bilinen anonim fonksiyonlar için aşağıdaki formda destek sağlar:

[capture](parameters) -> return_type { function_body } <span title="Kaynak: İngilizce Vikipedi, Bölüm &quot;Lambda expressions&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/C++#Lambda_expressions <span style="color:#dddddd">ⓘ</span>]</span>

C++20'den bu yana, anahtar sözcük olmadan bir lambda üzerine şablon parametreleri yazabilirsiniz şablon:

[capture]<template_parameters>(parameters) -> return_type { function_body } <span title="Kaynak: İngilizce Vikipedi, Bölüm &quot;Lambda expressions&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/C++#Lambda_expressions <span style="color:#dddddd">ⓘ</span>]</span>

Lambda parametre almıyorsa ve dönüş türü ya da diğer belirteçler kullanılmıyorsa, () atlanabilir, yani,

[capture] { function_body } <span title="Kaynak: İngilizce Vikipedi, Bölüm &quot;Lambda expressions&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/C++#Lambda_expressions <span style="color:#dddddd">ⓘ</span>]</span>

Bir lambda ifadesinin dönüş türü, mümkünse otomatik olarak çıkarılabilir, örn:

[](int x, int y) { return x + y; } // çıkarılır
[](int x, int y) -> int { return x + y; } // explicit <span title="Kaynak: İngilizce Vikipedi, Bölüm &quot;Lambda expressions&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/C++#Lambda_expressions <span style="color:#dddddd">ⓘ</span>]</span>

Bu [yakalama] listesi kapanışların tanımlanmasını destekler. Bu tür lambda ifadeleri standartta isimsiz bir fonksiyon nesnesi için sözdizimsel şeker olarak tanımlanmıştır.

İstisna işleme

İstisna işleme, bir çalışma zamanı sorununun veya hatasının varlığını tespit edildiği yerden sorunun ele alınabileceği yere iletmek için kullanılır. Tüm hataları tespit ederken bunun tek tip bir şekilde ve ana koddan ayrı olarak yapılmasına izin verir. Bir hata meydana gelirse, bir istisna atılır (yükseltilir) ve daha sonra en yakın uygun istisna işleyicisi tarafından yakalanır. İstisna, geçerli kapsamdan çıkılmasına ve ayrıca uygun bir işleyici bulunana kadar her bir dış kapsamdan çıkılmasına (yayılma) neden olur ve sırayla bu çıkılan kapsamlardaki tüm nesnelerin yıkıcılarını çağırır. Aynı zamanda bir istisna, tespit edilen sorunla ilgili verileri taşıyan bir nesne olarak sunulur.

Google'ın, LLVM'nin ve Qt'unki gibi bazı C++ stil kılavuzları istisnaların kullanımını yasaklar.

İstisnaya neden olan kod bir dene blok. İstisnalar ayrı bir blokta ele alınır. yakalamak blokları (işleyiciler); her dene bloğu, aşağıdaki örnekte görüldüğü gibi birden fazla istisna işleyicisine sahip olabilir.

#include <iostream>
#include <vektör>
#include <stdexcept> <span title="Kaynak: İngilizce Vikipedi, Bölüm &quot;Exception handling&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/C++#Exception_handling <span style="color:#dddddd">ⓘ</span>]</span>

int main() {
    dene {
        std::vector<int> vec{3, 4, 3, 1};
        int i{vec.at(4)}; // Bir istisna atar, std::out_of_range (vec için indeksleme 1-4 değil 0-3 arasındadır)
    }
    // Bir istisna işleyici, vec.at(4) tarafından atılan std::out_of_range öğesini yakalar
    catch (std::out_of_range &e) {
        std::cerr << "Var olmayan bir öğeye erişiliyor: " << e.what() << '\n';
    }
    // Diğer standart kütüphane istisnalarını yakalamak için (std::exception'dan türetilirler)
    catch (std::exception &e) {
        std::cerr << "Exception thrown: " << e.what() << '\n';
    }
    // Tanınmayan istisnaları yakalayın (yani std::exception'dan türetilmeyenleri)
    catch (...) {
        std::cerr << "Bazı ölümcül hatalar\n";
    }
}

İstisnaları kasıtlı olarak yükseltmek de mümkündür. atmak anahtar sözcüğü; bu istisnalar olağan şekilde ele alınır. Bazı durumlarda, istisnalar teknik nedenlerden dolayı kullanılamaz. Böyle bir örnek, her işlemin belirli bir süre içinde tamamlanmasının garanti edilmesi gereken gömülü bir sistemin kritik bir bileşenidir. Bir istisnanın işlenmesi için gereken maksimum süreyi belirlemek için herhangi bir araç bulunmadığından, bu süre istisnalar ile belirlenemez.

İşleme fonksiyonunun hata noktasından çağrıldığı sinyal işlemenin aksine, istisna işleme catch bloğuna girilmeden önce mevcut kapsamdan çıkar; bu blok mevcut fonksiyonda veya yığında bulunan önceki fonksiyon çağrılarından herhangi birinde bulunabilir.

Standart kütüphane

C++98 olarak onaylanan taslak "Working Paper" standardı; boyutunun yarısı C++ Standart Kütüphanesine ayrılmıştır.

C++ standardı iki bölümden oluşur: çekirdek dil ve standart kütüphane. C++ programcıları, C++'ın her büyük uygulamasında ikincisini bekler; toplu türleri (vektörler, listeler, eşlemeler, kümeler, kuyruklar, yığınlar, diziler, tuples), algoritmaları (find, for_each, binary_search, random_shuffle, vb. ), giriş/çıkış olanakları (iostream, konsoldan ve dosyalardan okuma ve yazma için), dosya sistemi kütüphanesi, yerelleştirme desteği, otomatik bellek yönetimi için akıllı işaretçiler, düzenli ifade desteği, çoklu iş parçacığı kütüphanesi, atomik desteği (bir değişkenin herhangi bir harici senkronizasyon olmadan aynı anda en fazla bir iş parçacığı tarafından okunmasına veya yazılmasına izin verir), zaman yardımcı programları (ölçüm, geçerli saati alma, vb. ), C++ istisnalarını kullanmayan hata raporlamasını C++ istisnalarına dönüştürmek için bir sistem, rastgele sayı üreteci ve C standart kütüphanesinin biraz değiştirilmiş bir versiyonu (C++ tip sistemine uygun hale getirmek için).

C++ kütüphanesinin büyük bir kısmı Standart Şablon Kütüphanesine (STL) dayanmaktadır. STL tarafından sağlanan faydalı araçlar arasında nesnelerin koleksiyonları olarak kaplar (vektörler ve listeler gibi), kaplara dizi benzeri erişim sağlayan yineleyiciler ve arama ve sıralama gibi işlemleri gerçekleştiren algoritmalar bulunur.

Ayrıca, hepsi uyumlu arayüzleri dışa aktaran (multi)maps (ilişkisel diziler) ve (multi)sets sağlanır. Bu nedenle, şablonları kullanarak herhangi bir konteynerle veya yineleyiciler tarafından tanımlanan herhangi bir dizi üzerinde çalışan genel algoritmalar yazmak mümkündür. C'de olduğu gibi, kütüphanenin özelliklerine aşağıdakiler kullanılarak erişilir #include yönergesi bir standart başlık eklemek için kullanılır. C++ Standart Kütüphanesi, 27'si kullanımdan kaldırılmış 105 standart başlık sağlar.

Standart, uzun yıllar boyunca genel algoritmalar ve kapsayıcılar ile deneyler yapan Alexander Stepanov tarafından tasarlanan STL'yi içermektedir. C++ ile çalışmaya başladığında, fonksiyon işaretçileri yerine inlining ve derleme zamanı bağlama gibi C++ özellikleri sayesinde, örneğin C standart kütüphanesi qsort'tan bile daha iyi performans gösteren genel algoritmalar (örneğin STL sort) oluşturmanın mümkün olduğu bir dil bulmuştur. Standart, standart kütüphanenin yalnızca bir parçası olduğu için "STL" olarak adlandırılmaz, ancak terim hala standart kütüphanenin geri kalanından (giriş / çıkış akışları, uluslararasılaştırma, tanılama, C kütüphanesi alt kümesi, vb) ayırt etmek için yaygın olarak kullanılmaktadır.

Çoğu C++ derleyicisi ve tüm büyük derleyiciler, C++ standart kütüphanesinin standartlara uygun bir uygulamasını sağlar.

C++ Çekirdek Yönergeleri

C++ Core Guidelines, C++'ın mucidi Bjarne Stroustrup ve C++ ISO Çalışma Grubu'nun kurucusu ve başkanı Herb Sutter tarafından, programcıların C++11 ve daha yeni dil standartları için en iyi uygulamaları kullanarak 'Modern C++' yazmalarına yardımcı olmak ve derleyici ve statik kontrol araçları geliştiricilerinin kötü programlama uygulamalarını yakalamak için kurallar oluşturmalarına yardımcı olmak için yürütülen bir girişimdir.

Temel amaç, verimli ve tutarlı bir şekilde tip ve kaynak güvenli C++ yazmaktır.

Temel Kılavuz İlkeler CPPCon 2015'in açılış konuşmasında duyurulmuştur.

Yönergelere, Çekirdek Yönergeleri ve Yönerge kurallarını uygulamak için statik denetleyici araçları uygulamak için yalnızca tür ve işlevlerden oluşan bir başlık kütüphanesi olan Yönerge Destek Kütüphanesi (GSL) eşlik eder.

Uyumluluk

C++ standartları komitesi, derleyici üreticilerine daha fazla özgürlük tanımak için isim değiştirme, istisna işleme ve diğer uygulamaya özel özelliklerin uygulanmasını dikte etmemeye karar vermiştir. Bu kararın dezavantajı, farklı derleyiciler tarafından üretilen nesne kodunun uyumsuz olmasının beklenmesidir. Bununla birlikte, belirli makineler veya işletim sistemleri için derleyicileri standartlaştırma girişimleri olmuştur (örneğin C++ ABI), ancak bunlar artık büyük ölçüde terk edilmiş gibi görünmektedir.

C ile

C++ genellikle C'nin bir üst kümesi olarak kabul edilir ancak bu tam olarak doğru değildir. Çoğu C kodu kolaylıkla C++'da doğru bir şekilde derlenebilir ancak bazı geçerli C kodlarının C++'da geçersiz olmasına veya farklı davranmasına neden olan birkaç farklılık vardır. Örneğin, C örtük dönüştürmeye izin verir void* diğer işaretçi türlerine dönüştürülebilir ancak C++ bunu yapmaz (tür güvenliği nedeniyle). Ayrıca, C++ birçok yeni anahtar sözcük tanımlar, örneğin yeni ve sınıfC programında tanımlayıcılar (örneğin, değişken adları) olarak kullanılabilir.

Bazı uyumsuzluklar, C standardının 1999 revizyonu (C99) ile ortadan kaldırılmıştır ve artık satır açıklamaları gibi C++ özelliklerini desteklemektedir (//) ve kodla karışık bildirimler. Öte yandan, C99, C++'ın desteklemediği ve C++'ta uyumsuz veya gereksiz olan değişken uzunluklu diziler, yerel karmaşık sayı türleri gibi bir dizi yeni özellik getirmiştir (ancak std::karmaşık sınıfı, kod uyumlu olmasa da benzer işlevsellik sağlar), belirlenmiş başlatıcılar, bileşik değişmezler ve kısıtlamak anahtar kelime. C99'un getirdiği özelliklerden bazıları C++ standardının sonraki sürümü olan C++11'e dahil edilmiştir (gereksiz olmayanlardan). Bununla birlikte, C++11 standardı, bir karakter işaretçisine bir dize değişmezinin atanmasına izin verilmemesi gibi yeni uyumsuzluklar getirmektedir ve bu durum C için geçerli olmaya devam etmektedir.

C ve C++ kodunu birbirine karıştırmak için, hem C hem de C++'da çağrılacak/kullanılacak herhangi bir işlev bildirimi veya tanımı, C bağlantısı ile extern "C" {/*...*/} blok. Böyle bir fonksiyon, isim değiştirmeye (yani fonksiyon aşırı yüklemesine) bağlı özelliklere dayanmayabilir.

Eleştiri

Yaygın olarak benimsenmesine rağmen, Linus Torvalds, Richard Stallman, Joshua Bloch, Ken Thompson ve Donald Knuth gibi bazı önemli programcılar C++ dilini eleştirmiştir.

C++'ın en sık eleştirilen noktalarından biri, bir dil olarak algılanan karmaşıklığıdır; uygulamada çok sayıda ortogonal olmayan özelliğin, kodun C++'ın bir alt kümesiyle sınırlandırılmasını gerektirdiği ve böylece ortak stil ve deyimlerin okunabilirlik avantajlarından kaçınıldığı eleştirisi vardır. Joshua Bloch tarafından ifade edildiği gibi:

Bence C++ karmaşıklık eşiğinin çok ötesine itildi ve yine de onu programlayan çok sayıda insan var. Ancak yaptığınız şey, insanları alt kümelere ayırmaya zorlamak. Bu yüzden C++ kullanan bildiğim neredeyse her dükkan, "Evet, C++ kullanıyoruz ama çoklu uygulama kalıtımı yapmıyoruz ve operatör aşırı yüklemesi kullanmıyoruz" diyor. Ortaya çıkan kodun karmaşıklığı çok yüksek olduğu için kullanmayacağınız bir sürü özellik var. Ve bunu yapmaya başlamanın iyi bir şey olduğunu düşünmüyorum. Herkesin birbirinin kodunu okuyabildiği bu programcı taşınabilirliğini kaybedersiniz ki bence bu çok iyi bir şeydir.

Edsger Dijkstra için "C++ ile programlamayı düşünmek" diyen Donald Knuth (1993, standartlaştırılmış C++ öncesi hakkında yorum yapıyor) "onu fiziksel olarak hasta ederdi":

Bugün onlarla yaşadığım sorun şu. C++ çok karmaşık. Şu anda, tüm egzotik özelliklerden kaçınmadığım sürece, birçok farklı sistemde çalışacağına inandığım taşınabilir kod yazmam imkansız. C++ dili tasarımcıları ne zaman bir sorunu nasıl çözmeleri gerektiğine dair birbiriyle yarışan iki fikre sahip olsalar, "Tamam, ikisini de yaparız" dediler. Bu yüzden dil benim zevkime göre fazla barok.

Bell Labs'da Stroustrup'un iş arkadaşı olan Ken Thompson, kendi değerlendirmesini yapıyor:

Kesinlikle iyi yanları var. Ancak genel olarak kötü bir dil olduğunu düşünüyorum. Pek çok şeyi yarı yarıya iyi yapıyor ve birbirini dışlayan fikirlerden oluşan bir çöp yığını. Tanıdığım herkes, ister kişisel ister kurumsal olsun, bir alt küme seçiyor ve bu alt kümeler farklı. Yani bir algoritmayı taşımak için iyi bir dil değil - "Bunu ben yazdım; al bakalım" demek için. Çok büyük, çok karmaşık. Ve belli ki bir komite tarafından oluşturulmuş. Stroustrup, dile yaptığı her türlü teknik katkının çok ötesinde, dilin kabul edilmesi ve kullanılması için yıllarca ve yıllarca kampanya yürüttü. Ve tüm standartlar komitelerini bir kırbaç ve bir başkanla yönetti. Ve kimseye "hayır" demedi. Var olan her özelliği o dile yerleştirdi. Temiz bir şekilde tasarlanmamıştı - sadece ortaya çıkan her şeyin birleşimiydi. Ve bence bundan çok zarar gördü.

Ancak yine Bell Labs'de meslektaşım olan Brian Kernighan bu değerlendirmeye karşı çıkıyor:

C++ son derece etkili olmuştur. ... Pek çok insan C++'ın çok büyük, çok karmaşık vs. vs. olduğunu söylüyor ama aslında çok güçlü bir dil ve içinde yer alan hemen her şeyin gerçekten sağlam bir nedeni var: Birileri rastgele icatlar yapmıyor, aslında insanlar gerçek dünya sorunlarını çözmeye çalışıyor. Bugün artık kanıksadığımız ve kullandığımız pek çok program C++ programlarıdır.

Stroustrup, C++ semantiğinin sözdiziminden çok daha temiz olduğunu belirtiyor: "C++ içinde, dışarı çıkmak için mücadele eden çok daha küçük ve temiz bir dil var".

Diğer şikayetler arasında yansıma veya çöp toplama eksikliği, uzun derleme süreleri, algılanan özellik sürünmesi ve özellikle şablon metaprogramlamasından kaynaklanan ayrıntılı hata mesajları sayılabilir.

Yordamsal Altyapı

İşleçler

C++'ın C'den devraldığı ve onu geliştirdiği yapılardan biridir. Kısaca, özel olarak anlamlandırılmış fonksiyonlar kümesidir. Ancak bu fonksiyonlar, alışılageldik şekilde çağırılmaz, dilin semantik yapısı içerisinde özel olarak değerlendirilir. operatörler çoğunlukla iki nesnenin arasına özel bir işaret konulmasıyla çağrılır. Örneğin, iki nesnenin toplanması için iki nesnenin arasına '+' işareti konulması yeterlidir. Bu işaret, derleyiciye '+' operatör fonksiyonunun çağırılacağını ifade eder. C'den farklı olarak, C++'ta operatörlerin çoğu aşırı yükleme yoluyla özelleştirilebilir.

Önişlemci

C++ Program kaynak kodlarının derlenmesi üç aşamadan oluşur: Önişlemci, kodun dönüştürülmesi ve bağlama. İlk aşama olan önişlemciyi basit bir yorumlayıcı olarak görülebilir. Bu aşamada, birtakım direktifler yardımıyla derlenecek kodlarda basit sözcüksel değişiklikler yapılabilir.

Önişlemci direktifleri # karakteriyle başlar, bu karakterden sonrası önişlemci tarafından yorumlanır ve bu özel karakterden önce beyaz boşluk(tab ve boşluk) dışında bir şey olmaması gerekir. Bu direktifler yardımıyla derlenecek kodlar üzerinde birtakım kurallar belirlenebilir. Ayrıca dosyaya bir başka dosyayı dahil etmek veya işlemciye özel direktifler vermek gibi işlemler içinde kullanılabilir.

Örnekler

Yorum Satırları

Yorum satırları bilgisayar tarafından çalıştırılmaz. Bunlar kodu okuyanın anlamasını kolaylaştırmak için eklenir.

// Tek satirdan olusan bir yorum
/*
  Birden 
  fazla 
  satirdan olusan yorumlar
*/ <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;Yorum Satırları&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#Yorum_Satırları <span style="color:#dddddd">ⓘ</span>]</span>

İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)

#include <iostream> <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

namespace matematik { <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

class Karmasik {
public:
  Karmasik() = default; <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

  Karmasik(const double reel, const double sanal)
      : reel_(reel), sanal_(sanal) {} <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

  Karmasik &operator+=(const Karmasik &diger); <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

  double real() const { return reel_; }
  void real(const double t) { reel_ = t; } <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

  double sanal() const { return sanal_; }
  void sanal(const double t) { sanal_ = t; } <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

  friend std::ostream &operator<<(std::ostream &os, const Karmasik &k); <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

private:
  double reel_ = 0;
  double sanal_ = 0;
}; <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

Karmasik &Karmasik::operator+=(const Karmasik &diger) {
  reel_ += diger.reel_;
  sanal_ += diger.sanal_; <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

  return *this;
} <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

std::ostream &operator<<(std::ostream &os, const Karmasik &k) {
  return os << k.reel_ << '+' << k.sanal_ << 'i' << '\n';
} <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

Karmasik operator+(const Karmasik &sol, const Karmasik &sag) {
  return Karmasik(sag.real() + sol.real(), sag.sanal() + sol.sanal());
} <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

} <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

int main() {
  using namespace matematik; <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

  Karmasik c;
  std::cout << c; // 0 + 0i <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

  Karmasik ilk(1, 0), ikinci(0, 1);
  Karmasik sonuc = ilk + ikinci;
  std::cout << sonuc; // 1 + 1i <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

  ilk += ikinci;
  std::cout << ilk; // 1 + 1i <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>

  return 0;
} <span title="Kaynak: Türkçe Vikipedi, Bölüm &quot;İşleçleri Aşırı Yükleme (DOS ya da Process Prompta)&quot;" class="plainlinks">[https://tr.wikipedia.org/wiki/C++#İşleçleri_Aşırı_Yükleme_(DOS_ya_da_Process_Prompta) <span style="color:#dddddd">ⓘ</span>]</span>