C++ - C++

C++
ISO C++ Logo.svg
Standart C++ tarafından onaylanan logo
paradigmalar Çoklu paradigma : prosedürel , işlevsel , nesne yönelimli , genel , modüler
Aile C
Tarafından tasarlandı Bjarne Stroustrup
geliştirici ISO/IEC JTC1 (Ortak Teknik Komite 1) / SC22 (Alt Komite 22) / WG21 (Çalışma Grubu 21)
İlk ortaya çıktı 1985 ; 36 yıl önce ( 1985 )
kararlı sürüm
C++20 (ISO/IEC 14882:2020) / 15 Aralık 2020 ; 9 ay önce ( 2020-12-15 )
Önizleme sürümü
C++23 / 18 Haziran 2021 ; 3 ay önce ( 2021-06-18 )
Yazma disiplini Statik , yalın , kısmen çıkarsanmış
işletim sistemi Çapraz platform
Dosya adı uzantıları .C, .cc, .cpp, .cxx, .c++ , .h, .H, .hh, .hpp, .hxx, .h++
İnternet sitesi isocpp .org
Başlıca uygulamalar
GCC , LLVM Clang , Microsoft Visual C++ , Embarcadero C++Builder , Intel C++ Compiler , IBM XL C++ , EDG
Tarafından etkilenmiş
Ada , ALGOL 68 , C , CLU , ML , Mesa , Modula-2 , Simula , Smalltalk
Etkilenen
Ada 95 , C# , C99 , Şapel , Clojure , D , Java , JS++ , Lua , Nim , Objective-C++ , Perl , PHP , Python , Rust , Seed7

C ++ ( / ˌ s Ben bir ˌ p l ʌ s p l ʌ s / ) a, genel amaçlı bir programlama dili ile oluşturulan Bjarne Stroustrup bir uzantısı olarak C programlama dilinde veya "ile C Classes ". Dil zamanla önemli ölçüde genişledi ve modern C++ artık düşük seviyeli bellek işleme olanaklarına ek olarak nesne yönelimli , genel ve işlevsel özelliklere sahip . Neredeyse her zaman derlenmiş bir dil olarak uygulanır ve birçok satıcı , Özgür Yazılım Vakfı , LLVM , Microsoft , Intel , Oracle ve IBM dahil olmak üzere C++ derleyicileri sağlar , bu nedenle birçok platformda kullanılabilir.

C++, sistem programlamaya ve gömülü , kaynak kısıtlı yazılımlara ve büyük sistemlere yönelik bir yönelimle tasarlanmıştır ; tasarımında öne çıkan özellikler performans , verimlilik ve kullanım esnekliğidir. C++, temel güçlü yönleri, masaüstü uygulamaları , video oyunları , sunucular (örn. e-ticaret , web araması veya veritabanları ) ve performans açısından kritik uygulamalar ( örn. örneğin telefon anahtarları veya uzay sondaları ).

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'de ISO/IEC 14882: 1998 olarak standartlaştırıldı ve daha sonra C++03 , C++11 , C++14 ve C++17 standartları ile değiştirildi. Mevcut C++20 standardı, yeni özellikler ve genişletilmiş bir standart kitaplık ile bunların yerini almaktadır . 1998'deki ilk standardizasyondan önce, C++, Danimarkalı bilgisayar bilimcisi Bjarne Stroustrup tarafından 1979'dan beri C dilinin bir uzantısı olarak Bell Laboratuarlarında geliştirildi ; Program organizasyonu için üst düzey özellikler de sağlayan C'ye benzer verimli ve esnek bir dil istedi . 2012'den beri C++, bir sonraki planlanan standart olarak C++23 ile üç yıllık bir sürüm programındadır .

Tarih

C++'ın yaratıcısı Bjarne Stroustrup, AT&T New Jersey'deki ofisinde c. 2000

1979'da Danimarkalı bir bilgisayar bilimcisi olan Bjarne Stroustrup , "C ++'ın öncülü olan " C with Classes ". Yeni bir dil yaratma motivasyonu, Stroustrup'un doktora tezi için programlama deneyiminden kaynaklandı. Stroustrup, Simula'nın büyük yazılım geliştirme için çok yararlı özelliklere sahip olduğunu, ancak dilin yazılım geliştirme için çok yavaş olduğunu buldu. ise pratik kullanımı BCPL hızlı ama çok düşük seviyeli büyük yazılım geliştirme için uygun olması. Stroustrup içinde çalışmaya başladığımda AT & T Bell Labs , o analiz sorunu vardı UNIX çekirdeği ile ilgili olarak dağıtılan bilgisayar ., Stroustrup doktora deneyimi hatırlayarak C dilini Simula benzeri özelliklerlegeliştirmek için yola çıktık.Genel amaçlı, hızlı, taşınabilir ve yaygın olarak kullanıldığı için C seçildi.C ve Simula'nın etkilerinin yanı sıra, diğer diller de bu yeni dili etkiledi, ALGOL 68 , Ada , CLU ve ML .

Başlangıçta Stroustrup'un "C with Classes" özelliği C derleyicisi Cpre'ye sınıflar , türetilmiş sınıflar , güçlü yazma , satır içi ve varsayılan bağımsız değişkenler dahil olmak üzere özellikler ekledi .

2015 yılında Paris'te verilen C++ 11 özellikleri üzerine bir sınav

1982 yılında Stroustrup o ( "C ++" adlı sınıfları ile C bir ardıl, geliştirmeye başladı olmanın artım operatörü farklı isimlerle geçmekte sonra C). Sanal işlevler , işlev adı ve operatör aşırı yüklemesi , referanslar , sabitler, tür güvenli boş depo bellek ayırma (yeni/silme), geliştirilmiş tür denetimi ve iki eğik çizgiyle ( ) BCPL stili tek satırlı yorumlar dahil olmak üzere yeni özellikler eklendi. . Ayrıca Stroustrup, C++, Cfront için yeni, bağımsız bir derleyici geliştirdi . ++//

1984 yılında Stroustrup ilk akış giriş/çıkış kitaplığını uygulamaya koydu. Adlandırılmış bir çıktı işlevi yerine bir çıktı operatörü sağlama fikri, daha önce Unix borularını öneren Doug McIlroy tarafından önerildi .

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

1989'da C++ 2.0 yayınlandı, ardından 1991'de The C++ Programming Language'ın güncellenmiş ikinci baskısı yayınlandı. 2.0'daki yeni özellikler arasında çoklu kalıtım, soyut sınıflar, statik üye işlevleri, const üye işlevleri ve korumalı üyeler yer aldı. 1990'da Açıklamalı C++ Referans Kılavuzu yayınlandı. Bu çalışma gelecekteki standardın temeli oldu. Daha sonraki özellik eklemeleri, şablonları , istisnaları , ad alanlarını , yeni yayınları ve bir Boole türünü içeriyordu .

1998'de, dili standartlaştıran C++98 yayınlandı ve 2003'te küçük bir güncelleme ( C++03 ) yayınlandı.

C++98'den sonra, C++, 2011'de C++11 standardı yayınlanarak, çok sayıda yeni özellik ekleyerek, standart kitaplığı daha da genişleterek 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 kesinleştikten sonra, 4 Eylül 2020'de C++20 standardının bir taslağı onaylandı ve 15 Aralık 2020'de resmi olarak yayınlandı.

3 Ocak 2018'de Stroustrup , "C++ programlama dilini kavramsallaştırmak ve geliştirmek için" Charles Stark Draper Mühendislik Ödülü'nün 2018 kazananı olarak açıklandı .

2021 itibariyle C++ , programlama dillerinin popülaritesinin bir ölçüsü olan TIOBE endeksinde C , Java ve Python'dan sonra dördüncü sırada yer aldı .

etimoloji

Stroustrup'a göre, "ad, C'den gelen değişikliklerin evrimsel doğasını ifade eder". Bu isim Rick Mascitti (orta 1983) yansıtılır ve ilk Aralık Mascitti adlandırma hakkında 1992 yılında gayri sorgulandı 1983 yılında kullanıldı, bunun bir de verildi belirtti dil-yanak ruhu. Adı C'nin gelen operatör (bu artırır değeri a değişkeni ve ortak) adlandırma kuralı geliştirilmiş bir bilgisayar programı göstermek için "+" kullanma. ++

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 oldukça açık bir yolu ile).
  • Programcılar kendi programlama stillerini seçmekte özgür olmalı ve bu stil C++ tarafından tam olarak desteklenmelidir.
  • Kullanışlı bir özelliğe izin vermek, C++'ın olası her türlü kötüye kullanımını önlemekten daha önemlidir.
  • Programları ayrı, iyi tanımlanmış bölümler halinde organize etmek için olanaklar sağlamalı ve ayrı ayrı geliştirilmiş bölümleri birleştirmek için olanaklar sağlamalıdır.
  • Tip sisteminde örtülü ihlal yok (ancak açık ihlallere izin verilir; yani programcı tarafından açıkça talep edilenler).
  • Kullanıcı tarafından oluşturulan türlerin, yerleşik türlerle aynı desteğe ve performansa sahip olması gerekir.
  • Kullanılmayan özellikler, oluşturulan yürütülebilir dosyaları olumsuz etkilememelidir (örn. daha düşük performansta).
  • C++ altında dil olmamalıdır ( Assembly dili dışında ).
  • C++ , kendi ayrı ve uyumsuz programlama ortamını geliştirmek yerine, mevcut diğer programlama dilleriyle birlikte çalışmalıdır .
  • Programcının amacı bilinmiyorsa, manuel kontrol sağlayarak programcının bunu belirlemesine izin verin.

Standardizasyon

1996 yılında Stockholm'deki C++ Standartları Komitesi toplantısında sahne
C++ standartları
Yıl C++ Standardı resmi olmayan ad
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ınladı ve şu anda bir sonraki revizyon olan C++23 üzerinde çalışıyor .

1998'de ISO çalışma grubu, C++'ı ilk kez , gayri resmi olarak C++98 olarak bilinen ISO/IEC 14882:1998 olarak standartlaştırdı . 2003 yılında, C++98'de tanımlanan 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 piyasaya sürülmedi. C++11 (14882:2011) hem çekirdek dile hem de standart kitaplığa 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 esas olarak hata düzeltmeleri ve küçük iyileştirmeler içeriyordu. 2014 yılı Ağustos ayı ortasında tamamlanan Taslak Uluslararası Standart oy pusulası prosedürleri.

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

Standardizasyon sürecinin bir parçası olarak ISO ayrıca teknik raporlar ve spesifikasyonlar yayınlar :

  • ISO/IEC TR 18015:2006, gömülü sistemlerde C++ kullanımı ve C++ dili ve kitaplık özelliklerinin performans üzerindeki etkileri hakkında,
  • ISO/IEC TR 19768:2007 ( C++ Teknik Rapor 1 olarak da bilinir ), çoğunlukla C++11'e entegre edilmiş kitaplık uzantıları hakkında ,
  • ISO/IEC TR 29124:2010, C++17'ye entegre edilmiş özel matematiksel fonksiyonlar hakkında
  • Ondalık kayan nokta aritmetiği üzerinde ISO/IEC TR 24733:2011 ,
  • Standart dosya sistemi kitaplığı üzerinde ISO/IEC TS 18822:2015, C++17 ile entegre
  • Standart kitaplık algoritmalarının paralel sürümleri üzerinde ISO/IEC TS 1970:2015, C++17'ye entegre edilmiştir
  • 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ş yeni bir kitaplık uzantıları seti üzerinde ,
  • C++ kavramlarına ilişkin ISO/IEC TS 19217:2015, C++20'ye entegre
  • ISO/IEC TS 19571:2016, bazıları halihazırda C++20'ye entegre edilmiş olan eşzamanlılık için kitaplık uzantıları hakkında
  • ISO/IEC TS 19568:2017, yeni bir genel amaçlı kitaplık uzantıları setinde
  • ISO/IEC TS 21425:2017, C++20'ye entegre edilmiş aralıklar için kitaplık uzantıları hakkında
  • Eşyordamlar üzerinde ISO/IEC TS 22277:2017, C++20'ye entegre
  • Ağ kitaplığı üzerinde ISO/IEC TS 19216:2018
  • Modüller üzerinde ISO/IEC TS 21544:2018, C++20'ye entegre
  • Paralellik için yeni bir kitaplık uzantıları setinde ISO/IEC TS 1970:2018

Statik yansıma da dahil olmak üzere daha fazla teknik özellik geliştirme aşamasında ve onay bekliyor.

Dilim

C++ dilinin iki ana bileşeni vardır: öncelikle C alt kümesi tarafından sağlanan donanım özelliklerinin doğrudan eşlenmesi ve bu eşlemelere dayalı sıfır genel gider soyutlamaları. Stroustrup, C++'ı "etkili ve zarif soyutlamalar oluşturmak ve kullanmak için [tasarlanmış] hafif bir soyutlama programlama dili" olarak tanımlar; ve "C++'ın temeli hem donanım erişimi hem de soyutlama sunmaktır. Onu diğer dillerden ayıran şey verimli bir şekilde yapmaktır."

C++, C'nin sözdiziminin çoğunu devralır . Aşağıda, standart çıktıya bir mesaj yazmak için C++ Standard Library akış özelliğini kullanan Hello world programının Bjarne Stroustrup'un sürümü yer almaktadır :

#include <iostream>

int main()
{
    std::cout << "Hello, world!\n";
}

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(), girilmeden önce oluşturulur (aşağıdaki istisnalara bakın) ve main()çıkışlardan sonra oluşturma sırasının tersi sırayla imha edilir . Uygulamalara, uygulamalarını nasıl organize edecekleri konusunda biraz özgürlük sağlamak için, tam oluşturma sırası standart tarafından belirtilmemiştir (aşağıda tanımlanan bazı kurallar olmasına rağmen). Daha resmi olarak, bu tür nesnelerin "program süresi boyunca sürecek" bir ömrü vardır.

Statik depolama süresi nesneleri iki aşamada başlatılır. Önce, "statik başlatma" yapılır ve yalnızca sonra tüm statik başlatma gerçekleştirilir, "dinamik başlatma" yapılır. Statik başlatmada, tüm nesneler önce sıfırlarla başlatılır; bundan sonra, sabit bir başlatma aşamasına sahip tüm nesneler sabit ifadeyle başlatılır (yani, değişmez veya ile başlatılan değişkenler constexpr). Standartta belirtilmemesine rağmen, statik başlatma aşaması derleme zamanında tamamlanabilir ve yürütülebilir dosyanın veri bölümüne kaydedilebilir. Dinamik başlatma, bir yapıcı veya işlev çağrısı aracılığıyla yapılan tüm nesne başlatma işlemlerini içerir (işlev constexprC++11'de ile işaretlenmemişse ). Dinamik başlatma 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ürdeki değişkenler, statik depolama süresi nesnelerine çok benzer. Temel fark, oluşturma süresinin iş parçacığı oluşturmadan hemen önce olması ve yok etme işleminin, iş parçacığı birleştirildikten sonra yapılmasıdır.

Otomatik saklama süresi nesneleri

C++'daki en yaygın değişken türleri, bir işlev 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 ömre sahip olmalarıdır. Bildirim noktasında oluşturulur ve potansiyel olarak başlatılırlar (ayrıntılar için aşağıya bakın) ve kapsam bırakıldığında oluşturmanın tersi sırayla imha edilirler . Bu, yığında ayırma tarafından uygulanır .

Yürütme noktası bildirim noktasından geçerken yerel değişkenler oluşturulur. Değişkenin bir yapıcısı veya başlatıcısı varsa, bu, nesnenin ilk 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 yaşam süresinin sonunda çağrılır ve C++'da yaygın olarak kullanılan RAII adlı otomatik kaynak yönetimi disiplinine izin verir .

Üye değişkenler, üst nesne oluşturulduğunda oluşturulur. Dizi üyeleri, 0'dan dizinin son üyesine kadar sırayla başlatılır. Üst nesne oluşturma işleminin tersi sırayla yok edildiğinde üye değişkenler yok edilir. yani ebeveyn bir "otomatik nesne" ise, tüm üyelerinin yok edilmesini tetikleyen kapsam dışına çıktığında yok edilecektir.

Geçici değişkenler, ifade değerlendirmesinin bir sonucu olarak oluşturulur ve ifadeyi içeren ifade tam olarak değerlendirildiğinde (genellikle ;bir ifadenin sonunda) yok edilir.

Dinamik depolama süresi nesneleri

Bu nesnelerin dinamik bir ömrü vardır ve doğrudan bir çağrıyla oluşturulabilir ve bir çağrıyla açıkça yok edilebilir . C++ ayrıca C'den ve öğesini destekler , ancak bunlar ve ile uyumlu değildir . Kullanımı , ayrılan belleğe bir adres döndürür. C++ Temel Yönergeleri , C++ 11'de tanıtılan tek sahiplik ve referanslı çoklu sahiplik aracılığıyla akıllı işaretçiler lehine dinamik nesneler oluşturmak için doğrudan kullanılmamasını tavsiye eder . newdeletemallocfreenewdeletenewnewmake_unique<T>make_shared<T>

şablonlar

C++ şablonları , genel programlamayı etkinleştirir . C++, işlev, sınıf, takma ad ve değişken şablonlarını destekler. Şablonlar türlere, derleme zamanı sabitlerine ve diğer şablonlara göre parametrelendirilebilir. Şablonlar , derleme zamanında örnekleme yoluyla uygulanır . Bir şablonu somutlaştırmak için derleyiciler, somut bir işlev veya sınıf örneği oluşturmak için şablonun parametreleri için belirli argümanları değiştirir. 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 ilkesiyle 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 gerektirir. Şablon kullanımı kod boyutunu artırabilir, çünkü her şablon örneklemesi şablon kodunun bir kopyasını üretir: her bir şablon argümanı seti için bir tane, ancak bu, kod elle yazılmış olsaydı oluşturulacak kodla aynı veya daha az miktardadır. Bu, derleme zamanında türün silindiği ve tek bir şablon gövdesinin korunduğu diğer dillerde (örneğin Java ) görülen çalışma zamanı jeneriklerinin aksine .

Şablonlar makrolardan farklıdır : Bu derleme zamanı dil özelliklerinin her ikisi de koşullu derlemeyi mümkün kılarken, şablonlar sözcüksel ikame ile sınırlı değildir. Şablonlar, tamamlayıcı dillerinin semantiğinin ve tür sisteminin yanı sıra tüm derleme zamanı tür tanımlarının farkındadır ve kesinlikle tür denetimi yapılan parametrelerin değerlendirilmesine dayalı programlı akış denetimi dahil olmak üzere üst düzey işlemleri gerçekleştirebilir. Makrolar, önceden belirlenmiş kriterlere dayalı olarak derleme üzerinde koşullu kontrol yeteneğine sahiptir, ancak yeni türleri başlatamaz, özyineleme yapamaz veya tür değerlendirmesi gerçekleştiremez ve aslında derleme öncesi metin değiştirme ve metin ekleme/hariç tutma 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 polimorfizm (aşağıya bakın) ve genel programlama için bir araçtır .

Ayrıca şablonlar, C++'da Turing-complete olan bir derleme zamanı mekanizmasıdır; bu, bir bilgisayar programı tarafından ifade edilebilen herhangi bir hesaplamanın, çalışma zamanından önce bir şablon meta programı tarafından bir şekilde hesaplanabileceği anlamına gelir .

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

nesneler

C++, C'ye nesne yönelimli programlama (OOP) özelliklerini tanıtır . OOP (ve bazı OOP dışı) dillerde yaygın olarak bulunan dört özelliği sağlayan sınıflar sunar : soyutlama , kapsülleme , miras ve çok biçimlilik . C++ sınıflarının diğer programlama dillerindeki sınıflarla karşılaştırıldığında ayırt edici bir özelliği, deterministik yıkıcıları desteklemesidir, bu da Kaynak Edinimi için destek sağlayan Başlatma (RAII) kavramıdır.

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 açık hale getirmek için bilgilerin gizlenmesidir. C++, birincil kapsülleme mekanizmaları olarak sınıfları ve işlevleri tanımlama yeteneği sağlar. Bir sınıf içinde, üyeler, kapsüllemeyi açıkça zorlamak için genel, korumalı veya özel olarak bildirilebilir. Sınıfın genel bir üyesine herhangi bir işlev için erişilebilir. Özel ü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") tarafından erişilebilir. Korumalı bir üyeye, sınıfın kendisine ve arkadaşlarına ek olarak sınıftan miras alan sınıf ü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şlevleri ve arkadaş işlevleri aracılığıyla destekler, ancak zorlamaz. Programcılar, bir türün temsilinin bir kısmını veya tamamını herkese açık olarak ilan edebilir ve kamu varlıklarını bir türün temsilinin parçası yapmamalarına izin verilir. Bu nedenle, C++ yalnızca nesne yönelimli programlamayı değil, modüler programlama gibi diğer ayrıştırma paradigmalarını da destekler .

Tüm verileri özel veya korumalı yapmak ve yalnızca sınıf kullanıcıları için minimum arabirimin parçası olan işlevleri herkese açık hale getirmek genellikle 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.

Miras

Kalıtım , bir veri türünün diğer veri türlerinin özelliklerini almasına izin verir. Bir temel sınıftan kalıtım, genel, korumalı veya özel olarak bildirilebilir. Bu erişim belirteci, ilişkisiz ve türetilmiş sınıfların, temel sınıfın devralınan genel ve korumalı üyelerine erişip erişemeyeceğini belirler. Yalnızca genel miras, genellikle "miras" ile kastedilene karşılık gelir. Diğer iki form çok daha az kullanılır. Erişim belirteci atlanırsa, bir "sınıf" özel olarak devralır, bir "yapı" ise genel olarak devralı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ından kaçınır.

Ç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" 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ırlandırırken (arayüzler, sınıfların aksine, yalnızca üye işlevlerinin bildirimlerini sağlar, uygulama veya üye olmadan ) birden çok arabirimin kalıtımına izin vererek benzer bir şeyi (daha sınırlı olsa da) gerçekleştirir. veri). C# ve Java'daki gibi bir arabirim, C++'ta yalnızca saf sanal işlevleri içeren bir sınıf olarak tanımlanabilir ve genellikle soyut bir temel sınıf veya "ABC" olarak bilinir . Böyle bir soyut temel sınıfın üye işlevleri, normalde türetilmiş sınıfta açıkça tanımlanır, örtük olarak miras alınmaz. C++ sanal kalıtım, baskınlık adı verilen bir belirsizlik çözümleme özelliği sergiler .

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

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

C++, temel aritmetik, bit işleme, dolaylı yönlendirme, 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şullu operatör gibi birkaç dikkate değer istisna dışında, hemen hemen tüm operatörler kullanıcı tanımlı türler için aşırı yüklenebilir . Zengin aşırı yüklenebilir operatörler kümesi, C++'da kullanıcı tanımlı türlerin yerleşik türler 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 operatörün aşırı yüklenmesi, operatörü içeren hesaplamaların önceliğini veya operatörün kullandığı işlenenlerin sayısını değiştirmez (her ne kadar herhangi bir işlenen, çalıştırmadan önce değerlendirilecek olsa da, operatör tarafından göz ardı edilebilir). Aşırı yüklenmiş " &&" ve " ||" operatörler kısa devre değerlendirme özelliklerini kaybeder .

polimorfizm

Polimorfizm , birçok uygulama için ortak bir arabirime ve nesnelerin farklı koşullar altında farklı davranmasına olanak tanır.

C++, yukarıda açıklanan dil özellikleri tarafından desteklenen birkaç tür statik ( derleme zamanında çözülür ) ve dinamik ( çalışma zamanında çözülür ) polimorfizmlerini destekler. Derleme zamanı polimorfizmi , belirli çalışma zamanı kararlarına izin vermezken , çalışma zamanı polimorfizmi tipik olarak bir performans cezasına neden olur.

statik polimorfizm

İşlev aşırı yüklemesi , programların aynı ada sahip ancak farklı argümanlarla (yani geçici polimorfizm ) birden çok işlevi bildirmesine olanak tanır . İşlevler, biçimsel parametrelerinin sayısı veya türleri ile ayırt edilir . Bu nedenle, aynı işlev adı, kullanıldığı bağlama bağlı olarak farklı işlevlere 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, derleme zamanı hata iletisine neden olur.

Bir fonksiyon bildirirken, bir programcı bir veya daha fazla parametre için varsayılan bir değer belirleyebilir . Bunu yapmak, işlev çağrıldığında varsayılanlara sahip parametrelerin isteğe bağlı olarak çıkarılmasına izin verir, bu durumda varsayılan bağımsız değişkenler kullanılır. Bir işlev, bildirilen parametrelerden daha az argümanla çağrıldığında, açık argümanlar parametrelerle soldan sağa sırayla eşleştirilir ve parametre listesinin sonundaki eşleşmeyen parametrelere varsayılan argümanları atanır. Çoğu durumda, tek bir işlev bildiriminde varsayılan bağımsız değişkenlerin belirtilmesi, farklı sayıda parametreyle aşırı yüklenmiş işlev tanımları sağlamaya tercih edilir.

C++'daki şablonlar , genel, polimorfik kod (yani parametrik polimorfizm ) yazmak için gelişmiş bir mekanizma sağlar . Özellikle, tuhaf bir şekilde yinelenen şablon deseni aracılığıyla, sanal işlevleri geçersiz kılmak için sözdizimini yakından taklit eden bir statik polimorfizm biçimi uygulamak mümkündür. C++ şablonları türe duyarlı ve Turing-tamamlayıcı olduğundan , derleyicinin özyinelemeli koşulları çö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 derlemeden sonra toplu kod oluşturmaz.

dinamik polimorfizm

Miras

Değişken işaretçiler ve C++'da bir temel sınıf türüne yapılan başvurular, o türden türetilmiş herhangi bir sınıfın nesnelerine de başvurabilir. Bu, dizilerin ve diğer kap türlerinin farklı türdeki nesnelere işaretçi tutmasına izin verir (referanslar doğrudan kaplarda tutulamaz). Bu, başvurulan nesnelerin (gerçek, türetilmiş) türlerine bağlı olarak farklı davranabileceği dinamik (çalışma zamanı) polimorfizmi sağlar.

C++ ayrıca, kodun bir nesneyi bir temel referans/işaretçi aracılığıyla daha türetilmiş bir türe güvenli bir şekilde dönüştürmeye çalışmasına izin veren operatörü sağlar: downcasting . Girişimi genellikle tek referansıyla birlikte türetilmiş tip bilmez olarak gereklidir. ( Upcasting , daha genel bir türe dönüştürme, derleme zamanında her zaman aracılığıyla kontrol edilebilir/gerçekleştirilebilir , çünkü atasal sınıflar türetilmiş sınıfın arayüzünde tüm arayanlar tarafından görülebilir olarak belirtilir.) çalışma zamanı tür bilgisine (RTTI) dayanır , türlerin ve bunların ilişkilerinin ayırt edilmesini sağlayan programdaki meta veriler. Bir Eğer bir işaretçi başarısız, sonuç hedef, bir referans (boş olamaz), dökme bir özel durum ise, oysa sabiti. Belirli bir türetilmiş türe sahip olduğu bilinen nesneler , RTTI ve güvenli çalışma zamanı tür denetimi atlanarak buna dönüştürülebilir , bu 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. dynamic_caststatic_castdynamic_castdynamic_castnullptrstatic_castdynamic_cast

Sanal üye işlevleri

Normalde, türetilmiş bir sınıftaki bir işlev, bir temel sınıftaki bir işlevi geçersiz kılarsa, ç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ünde 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önderme denir . Sanal üye işlevleri veya yöntemleri , nesnenin gerçek çalışma zamanı türüne göre çağrılacak işlevin en özel uygulaması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 atlanabilir , ancak genel olarak sanal işlevlere yapılan çağrılar çalışma zamanında çözümlenir.

Standart üye işlevlerine ek olarak, operatör aşırı yüklemeleri ve yıkıcılar sanal olabilir. Pratik deneyime dayanan kesin olmayan bir kural, sınıftaki herhangi bir fonksiyon sanal ise, yıkıcının da olması gerektiğini belirtir. Oluşturulma sırasındaki bir nesnenin türü derleme zamanında bilindiğinden, yapıcılar ve buna bağlı olarak kopya yapıcılar sanal olamaz. Bununla birlikte, türetilmiş bir nesneye bir işaretçi, bir temel nesneye bir işaretçi olarak geçirildiğinde, bir nesnenin bir kopyasının yaratılmasının gerektiği bir durum ortaya çıkabilir. Böyle bir durumda, ortak bir çözüm, çağrıldığında türetilmiş sınıfın bir kopyasını oluşturan ve döndüren (veya benzeri) bir sanal işlev oluşturmaktır. clone()

Bir üye işlevi , kapanış parantezinden sonra ve noktalı virgülden önce ekleyerek "saf sanal" hale getirilebilir . Saf bir sanal işlev içeren bir sınıfa soyut sınıf denir . Soyut bir sınıftan nesneler oluşturulamaz; sadece türetilebilirler. Herhangi bir türetilmiş sınıf, sanal işlevi saf olarak devralır ve türetilmiş 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 işlevi veya devralınan saf sanal üye işleviyle bir sınıfın nesnesini yaratmaya çalışan bir program hatalı biçimlendirilmiştir. = 0

Lambda ifadeleri

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

[capture](parameters) -> return_type { function_body }

C++20'den beri, şablon parametreleri anahtar kelimesi olmadan yazabilirsiniz : template

[capture]<template_parameters>(parameters) -> return_type { function_body }

Lambda parametre almıyorsa, () ihmal edilebilir, yani,

[capture] -> return_type { function_body }

Ayrıca, bir lambda ifadesinin dönüş türü, mümkünse otomatik olarak çıkarılabilir, örneğin:

[](int x, int y) { return x + y; } // inferred
[](int x, int y) -> int { return x + y; } // explicit

Liste tanımını destekler kapanışları . Bu tür lambda ifadeleri standartta adsız bir işlev nesnesi için sözdizimsel şeker olarak tanımlanır . [capture]

İstisna işleme

İstisna işleme, bir çalışma zamanı sorununun veya hatanın varlığının algılandığı yerden sorunun ele alınabileceği yere iletilmesi 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 oluşursa, en yakın uygun istisna işleyicisi tarafından yakalanan bir istisna atılır (yükseltilir). İstisna, mevcut kapsamdan ve ayrıca uygun bir işleyici bulunana kadar her bir dış kapsamdan (yayılma) çıkılmasına neden olur ve bu çıkılan kapsamlardaki herhangi bir nesnenin yıkıcılarını çağırır. Aynı zamanda, bir istisna, tespit edilen sorunla ilgili verileri taşıyan bir nesne olarak sunulur.

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

İstisnaya neden olan kod bir bloğun içine yerleştirilir . İstisnalar ayrı bloklarda (işleyiciler) işlenir ; Aşağıdaki örnekte görüldüğü gibi, her blok birden fazla istisna işleyiciye sahip olabilir. trycatchtry

#include <iostream>
#include <vector>
#include <stdexcept>

int main() {
    try {
        std::vector<int> vec{3, 4, 3, 1};
        int i{vec.at(4)}; // Throws an exception, std::out_of_range (indexing for vec is from 0-3 not 1-4)
    }
    // An exception handler, catches std::out_of_range, which is thrown by vec.at(4)
    catch (std::out_of_range &e) {
        std::cerr << "Accessing a non-existent element: " << e.what() << '\n';
    }
    // To catch any other standard library exceptions (they derive from std::exception)
    catch (std::exception &e) {
        std::cerr << "Exception thrown: " << e.what() << '\n';
    }
    // Catch any unrecognised exceptions (i.e. those which don't derive from std::exception)
    catch (...) {
        std::cerr << "Some fatal error\n";
    }
}

Anahtar kelimeyi kullanarak, kasıtlı olarak istisnalar oluşturmak da mümkündür ; bu istisnalar olağan şekilde işlenir. Bazı durumlarda, teknik nedenlerle istisnalar 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 ele alınması için gereken maksimum süreyi belirlemek için hiçbir araç bulunmadığından, bu istisnalarla belirlenemez. throw

İşleme işlevinin başarısızlık noktasından çağrıldığı sinyal işlemeden farklı olarak , istisna işleme, geçerli işlevde veya o anda yığında bulunan önceki işlev çağrılarından herhangi birinde bulunabilen catch bloğu girilmeden önce geçerli kapsamdan çıkar.

Standart kitaplık

C++98 olarak onaylanan taslak "Working Paper" standardı; boyutunun yarısı C++ Standard Library'ye ayrılmıştı.

C++ standardı iki bölümden oluşur: çekirdek dil ve standart kitaplık. C++ programcıları, C++'ın her büyük uygulamasında ikincisini bekler; toplama türleri ( vektörler , listeler, haritalar, kümeler, kuyruklar, yığınlar, diziler , demetler ), algoritmalar (find, for_each , binary_search , random_shuffle, vb.), giriş/çıkış olanakları ( iostream , kaynaktan okumak ve ona yazmak için) konsol ve dosyalar), dosya sistemi kitaplığı, yerelleştirme desteği, otomatik bellek yönetimi için akıllı işaretçiler , düzenli ifade desteği, çoklu iş parçacığı kitaplığı, atom desteği (herhangi bir harici işlem olmadan bir değişkenin aynı anda en fazla bir iş parçacığı tarafından okunmasına veya yazılmasına izin verme) senkronizasyon), zaman yardımcı programları (ölçüm, şimdiki zamanı alma, vb.), C++ istisnalarını kullanmayan hata raporlamasını C++ istisnalarına dönüştürmek için bir sistem , bir rastgele sayı üreteci ve C standart kitaplığının biraz değiştirilmiş bir versiyonu (yapmak için). C++ tipi sistemle uyumludur).

C++ kitaplığının büyük bir kısmı Standart Şablon Kitaplığı'na (STL) dayanmaktadır . STL sağladığı kullanışlı araçlar içerir kaplar (örneğin nesnelerin koleksiyonları gibi vektörleri ve listeleri ), yineleyici dizisi benzeri kaplar erişim sağlar ve algoritmalar , örneğin arama ve sıralama gibi işlemleri yerine getirir.

Ayrıca, (çoklu)haritalar ( ilişkisel diziler ) ve (çoklu)kümeler sağlanır, bunların tümü uyumlu arabirimleri dışa aktarır. Bu nedenle, şablonları kullanarak, herhangi bir kapsayıcıyla veya yineleyiciler tarafından tanımlanan herhangi bir sıra üzerinde çalışan genel algoritmalar yazmak mümkündür. C'de olduğu gibi , kitaplığın özelliklerine standart bir başlık eklemek için yönerge kullanılarak erişilir . C ++ Standart kütüphane 27 kaldırılmış olan 105 standart başlıklarını içerir. #include

Standart, uzun yıllar jenerik algoritmalar ve kapsayıcılarla deneyler yapan Alexander Stepanov tarafından orijinal olarak tasarlanan STL'yi içermektedir. C++ ile başladığında, sonunda, satır içi oluşturma ve derleme gibi C++ özellikleri sayesinde, örneğin C standart kitaplığı qsort'tan daha iyi performans gösteren genel algoritmalar (örneğin, STL sıralama) oluşturmanın mümkün olduğu bir dil buldu. işlev işaretçileri yerine zaman bağlama. Standart, standart kitaplığın yalnızca bir parçası olduğu için standarttan "STL" olarak bahsetmez, ancak terim onu ​​standart kitaplığın geri kalanından (giriş/çıkış akışları, uluslararasılaştırma, tanılama, C kitaplığı alt kümesi, vb.).

Çoğu C++ derleyicisi ve bunların tümü, C++ standart kitaplığının standartlara uygun bir uygulamasını sağlar.

C++ Temel Yönergeleri

C++ Temel Yönergeleri, C++'ın mucidi Bjarne Stroustrup ve C++ ISO Çalışma Grubunun düzenleyicisi ve başkanı Herb Sutter tarafından yürütülen ve programcıların C+ dil standartları için en iyi uygulamaları kullanarak 'Modern C++' yazmalarına yardımcı olmak için yürütülen bir girişimdir. +14 ve daha yenisi ve derleyici geliştiricilerinin ve statik kontrol araçlarının kötü programlama uygulamalarını yakalamak için kurallar oluşturmasına yardımcı olmak.

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

Temel Kılavuz İlkeler, CPPCon 2015'teki açılış konuşmasında duyuruldu.

Yönergelere, Temel Yönergeleri ve Yönerge kurallarını uygulamak için statik denetleyici araçlarını uygulamaya yönelik tür ve işlevlerden oluşan yalnızca bir başlık kitaplığı olan Yönerge Destek Kitaplığı (GSL) eşlik eder.

uyumluluk

Derleyici vermek C ++ standartları komitesi uygulanmasını dikte karar, daha fazla özgürlük satıcıları Cendereleme , istisna işleme ve diğer uygulama özgü özellikler. Bu kararın dezavantajı, farklı derleyiciler tarafından üretilen nesne kodunun uyumsuz olmasının beklenmesidir. Bununla birlikte, derleyicileri belirli makineler veya işletim sistemleri (örneğin C++ ABI) için standartlaştırma girişimleri vardı, ancak şimdi büyük ölçüde terk edilmiş gibi görünüyorlar.

C ile

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

Bazı uyumsuzluklar , artık satır yorumları ( ) ve kodla karıştırılmış bildirimler gibi C++ özelliklerini destekleyen C standardının ( C99 ) 1999 revizyonuyla kaldırılmıştır //. Öte yandan, C99, değişken uzunluklu diziler , yerel karmaşık sayı türleri (ancak, C++ standart kitaplığındaki sınıf benzer işlevsellik sağlar) gibi C++'da uyumsuz veya gereksiz olan C++'ın desteklemediği bir dizi yeni özelliği tanıttı. , kod uyumlu olmasa da), belirlenmiş başlatıcılar, bileşik değişmez değerler ve anahtar kelime. C99'da tanıtılan özelliklerden bazıları, C++ standardının sonraki sürümü olan C++11'e dahil edilmiştir (gereksiz olanlardan). Bununla birlikte, C++ 11 standardı, geçerli C'yi koruyan bir karakter işaretçisine bir dize değişmezinin atanmasına izin vermemek gibi yeni uyumsuzluklar getirir. std::complexrestrict

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

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ştirdiler .

C++'ın en sık eleştirilen noktalarından biri, bir dil olarak algılanan karmaşıklığıdır ve uygulamada çok sayıda ortogonal olmayan özelliğin kodu C++'ın bir alt kümesiyle sınırlandırmayı gerektirdiği ve böylece ortak stil ve deyimlerin okunabilirlik faydalarından kaçındığı eleştirisiyle birlikte . Joshua Bloch'un ifade ettiği gibi :

C++'ın karmaşıklık eşiğinin çok ötesine geçtiğini düşünüyorum, ancak yine de onu programlayan birçok insan var. Ama yaptığınız şey, insanları onu alt kümeye almaya zorlamak. C++ kullandığını bildiğim hemen hemen her mağaza, "Evet, C++ kullanıyoruz ama çoklu uygulama kalıtımı yapmıyoruz ve operatör aşırı yüklemesini kullanmıyoruz" diyor. Ortaya çıkan kodun karmaşıklığı çok yüksek olduğu için kullanmayacağınız bir sürü özellik var.Bunu yapmaya başlamanız gerektiğinde bunun iyi olduğunu düşünmüyorum.Herkesin yapabileceği bu programcı taşınabilirliğini kaybedersiniz. herkesin kodunu oku, bence çok iyi bir şey.

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

Bugün onlarla yaşadığım sorun şu ki... C++ çok karmaşık. Şu anda, tüm egzotik özelliklerden kaçınmadıkça, birçok farklı sistemde çalışacağına inandığım taşınabilir kod yazmam imkansız. Ne zaman C++ dil tasarımcıları bir problemi nasıl çözecekleri konusunda birbiriyle rekabet halinde olan iki fikre sahip olsalar, "Tamam, ikisini de yapacağız" dediler. Yani dil benim zevkime göre fazla barok.

Stroustrup'un Bell Laboratuarlarında çalışma arkadaşı olan Ken Thompson , değerlendirmesini yapıyor:

Kesinlikle iyi yönleri var. Ama genel olarak bunun kötü bir dil olduğunu düşünüyorum. Pek çok şeyi yarı yarıya iyi yapıyor ve sadece birbirini dışlayan çöp bir fikir yığını. Tanıdığım herkes, ister kişisel ister kurumsal olsun, bir alt küme seçer ve bu alt kümeler farklıdır. Bu yüzden bir algoritmayı taşımak, "Bunu ben yazdım; al, al" demek için iyi bir dil değil. Çok büyük, çok karmaşık. Ve belli ki bir komite tarafından inşa edilmiş . Stroustrup, dile yaptığı her türlü teknik katkının ötesinde, dili benimsetmek ve kullanmak için yıllarca ve yıllarca kampanya yürüttü. Ve tüm standart komitelerini bir kamçı ve bir sandalyeyle yönetti. Ve kimseye "hayır" dedi. O dilde var olan her özelliği koydu. Temiz bir şekilde tasarlanmamıştı - sadece ortaya çıkan her şeyin birleşimiydi. Ve bence bundan büyük ölçüde zarar gördü.

Ancak aynı zamanda Bell Labs'de bir meslektaşı olan Brian Kernighan bu değerlendirmeye itiraz ediyor:

C++ son derece etkili olmuştur. ... Pek çok insan C++'ın çok büyük ve çok karmaşık vs. vs. olduğunu söylüyor ama aslında bu çok güçlü bir dil ve orada bulunan hemen hemen her şeyin gerçekten sağlam bir nedeni var: rastgele icat yapan biri değil , aslında gerçek dünya sorunlarını çözmeye çalışan insanlardır. Bugün kullandığımız pek çok program C++ programlarıdır.

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

Diğer şikayetler, yansıma veya çöp toplama eksikliği , uzun derleme süreleri, algılanan özellik kayması ve özellikle şablon metaprogramlamadan gelen ayrıntılı hata mesajlarını içerebilir.

Ayrıca bakınız

Referanslar

daha fazla okuma

Dış bağlantılar