İçeriğe atla

C++

C++
C++ Standard Komitesi'nin onayladığı logo
ParadigmasıÇok paradigmalı: yordamsal, işlevsel, fonksiyonel, nesne yönelimli, jenerik, modüler, genel
İlk çıkışı1985 (39 yıl önce) (1985)
TasarımcıBjarne Stroustrup
GeliştiriciBjarne Stroustrup
Bell Labs
ISO/IEC JTC1/SC22/WG21
Kararlı sürümC++20 ISO/IEC 14882:2020 / (15 Aralık 2020 (3 yıl önce) (2020-12-15))
Önizleme sürümüC++23 / (19 Mart 2023)
Önemli uygulamalarıGCC, LLVM Clang, Microsoft Visual C++, Embarcadero C++ Builder, Intel C++ Compiler, IBM XL C++, EDG
LehçeleriISO/IEC 14882:1998,[1]

ISO/IEC 14882:2003,[2]

ISO/IEC 14882:2011,[3]

ISO/IEC 14882:2014,[4]

ISO/IEC 14882:2017,[5]

ISO/IEC 14882:2020,[6]

ISO/IEC PRF 14882 Devam eden[7]
EtkilendikleriC, Simula, Ada 83, ALGOL 68, CLU, ML
EtkiledikleriPerl, LPC, Lua, Pike, Ada 95, Java, PHP, D, C99, C#, Falcon
İşletim sistemiÇapraz platform
Olağan dosya uzantıları.C .cc cpp .cxx .c++
.H .hh .hpp .hxx .h++ .h
.cppm .ixx
Web sitesiisocpp.org
AilesiC
Bjarne Stroustrup, C++ dilinin yaratıcısı, AT&T New Jersey'deki ofisinde, y. 2000

C++ (/ˈs plʌs plʌs/, telaffuz: si pılas pılas), Bjarne Stroustrup tarafından 1979 yılında Bell Laboratuvarları'nda geliştirilmeye başlanmış,[8] 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. Günüzümüzde en çok kullanılan programlama dillerinden biri olmuştur.

C++ tasarlanırken C programlama dili ile olabildiğince uyumlu olması[9] göz önüne bulundurulmuş ve K&R2'deki tüm örnek kodun derleneceği şekilde tasarlanmıştır.[10]

C++, C'nin sağladığı alt seviye sıkı donanım desteğinin yanında farklı veri türleri, sınıf, template, sıradışı durum yönetimi, isim alanı (namespace), işleç fazladan yüklemesi, işlev fazladan yüklemesi, referans, hafıza yönetimi ve pek çok kütüphane imkanı sunar.

Tarihi

1979 senesinde bir Danimarkalı bilgisayar bilimci olan Bjarne Stroustrup, sonradan C++ olarak bilinecek olan "C with Classes" üzerinde çalışmaya başladı.[11] Onu yeni bir dil geliştirmeye iten şey, doktora tezini geliştirirkenki programlama deneyimiydi. Stroustrup, Simula'nın büyük yazılımlar geliştirmeye yardımcı olan pek çok özelliğe sahip olduğunu, fakat dilin pratikte kullanım için fazla yavaş kaldığını, BCPL'in ise hızlı ancak büyük yazılımlar geliştirmek için fazla alt-seviye olduğunu fark etti. Stroustrup AT&T Bell Labs'ta çalışmaya başladığında UNIX çekirdeğini dağıtık bir sistem olarak incelemeye başladı. Doktora deneyiminden yola çıkarak, C dilini Simula'nın özellikleriyle zenginleştirmek için yola çıktı.[12] C dili seçildi çünkü genel amaçlı, hızlı, taşınabilir ve zaten yaygın olarak kullanılıyordu.

Başlangıçta, Stroustrup'un "C with Classes"ı sınıflar, türetilmiş sınıflar, güçlü türleme (strong typing), varsayılan fonksiyon argümanları (default argument) gibi özelliklerini bir C derleyicisi olan CPre'ye eklenmiştir.[13]

1982'de Stroustrup C with Classes'ı daha da ileri taşıyan, pek çok diğer isimlendirmelerden sonra "C++" (++ C'deki artırma operatörüdür) olarak anılan dili geliştirdi. Sanal fonksiyon, fonksiyon adı ve operatör fazladan yüklenmesi, referanslar, sabit oluşturma (constant), tür-güvenli bellek tahsisi (new ve delete kullanarak), geliştirilmiş tür kontrolü, BCPL'deki gibi iki slash karakteriyle yapılan tek satırlık yorumlar (//) eklenen özellikler arasındaydı. Dahası, Stroustrup, C++ için yeni bir derleyici olan Cfront'u geliştirdi.

1984'te, Stroustrup ilk giriş/çıkış kütüphanesini gerçekledi. Bir isimli fonksiyon yerine çıkış operatörünün (<<) sağlanması fikri Doug McIlroy [en][14] tarafından önerilmiştir (McIlroy öncesinde Unix pipe'larını öneren kişidir).

1985'te The C++ Programming Language'in ilk baskısı yapılmış ve henüz resmi bir standard olmadığından bu kitap bir kesin referans olarak kabul edilmiştir.[15] C++'ın ilk ticari gerçeklenimi aynı yılın ekim ayında yayınlanmıştır.[11]

1989'da C++ 2.0 yayınlandı ve 1991'de The C++ Programming Language kitabının güncellenmiş ikinci baskısı yapıldı.[16] C++ 2.0 ile çoklu kalıtım, soyut sınıflar, statik üye fonksiyon, const üye fonksiyonlar ve protected üyeler eklenmiştir. 1990'da The Annotated C++ Reference Manual yayınlandı. Bu kitap, gelecekte yayınlanacak olan resmi standard için bir taban teşkil etmiştir. Sonrasında eklenen özellikler, template, sıradışı durum yönetimi, isim alanları, yeni isimli castlar (tür dönüştürme) ve bool veri türüdür.

1998'de C++98 yayınlandı ve dilin standardlaştırılması başladı. 2003'te küçük bir güncelleme olan C++03 yayınlandı.

C++98 sonrasında C++'ın evrimi 2011'e kadar görece yavaş ilerlemiştir. 2011'de C++11 yayınlandı. C++11 ile standard kütüphane genişlemiş ve C++ programcılarının faydalanacağı pek çok özellik eklenmiştir. Bir başka küçük güncelleme olan C++14 Aralık 2014'te yayınlandı. C++17 daha büyük bir güncellemedir ve Aralık 2017'de yayınlanmıştır.[17] Şubat 2020'de tasarısı sonlandırılan [18] C++20 standardı 4 Eylül 2020 onaylanmış ve resmi olarak 15 Aralık 2020 basılmıştır.[19][20]

Stroustrup, 3 Ocak 2018'de "C++ programlama dilini kavramsallaştırması ve geliştirmesi" nedeniyle Charles Stark Draper Prize mühendislik ödülünün 2018 yılı kazananı olarak duyurulmuştur.[21]

(Aralık 2022 (2022-Aralık) itibarıyla) C++ TIOBE index'te Java'yı TIOBE sıralamasındaki tarihinde ilk kez geride bırakmış Python ve C programlama dillerinin ardından üçüncü sırada listelenmiştir.[22]

Etimoloji

Stroustrup'a göre, "isim C dilinden yapılan değişimlerin evrimsel doğasını vurguluyor."[23] İsimlendirme Rick Mascitti tarafından (1983'ün ortalarında)[13] yapılmıştır ve ilk defa Aralık 1983'te kullanılmıştır. Mascitti'ye bununla ilgili soru yöneltiğinde (1992'de), mizah amaçlı bu ismin verildiğini belirtmiştir. İsimlendirme C'nin ++ operatöründen (eklendiği değişkenin değerini artırır) gelir ve "+" geliştirilmiş bilgisayar programlarını ifade etmede kullanılan yaygın bir isimlendirme geleneğidir.

C++'ın geliştirilmesi sürecinde, dil son adını almadan evvel, "new C" ve "C with Classes"[13][24] diye anıldığı da olmuştur.

Standardizasyon

Bir programlama dilini oluşturan gramer, anlam ve standard kütüphane yapıları muğlak olmayacak bir biçimde belgelenir (spec veya specification) ve yayınlanır. Derleyici sağlayıcıları bu belgeyi kullanarak dili gerçekleyen derleyiciyi oluşturur.

C++ dilinin özelliklerini belirleyen bu belge (buradan sonrasında, standard) ISO / IEC Ortak Teknik Komitesi 1 (İng: Joint Technical Committee 1, JTC1) / Altkomite 22 (Subcommittee 22, SC22) Çalışma Grubu 21 (Working Group 21, WG21) (ISO/IEC JTC1/SC22/WG21) tarafından geliştirilir.[25]

İlk standard 1998'de ISO/IEC 14882:1998 adıyla yayınlandı. Sonrasında C++03, C++11, C++14, C++17 ve mevcut standard olan C++20 yayınlandı. 2012 sonrası üçer senelik periyotlarla yayınlanmaya başlanmıştır.

Dil

C++ dili iki temel bileşenden oluşur: C'den devraldığı yapılarla donanım özellikleriyle doğrudan eşleşme ve bu eşleşmeler üzerine kurulmuş maliyetsiz soyutlamalar (zero-overhead abstractions). Stroustrup C++'ı şu şekilde açıklamıştır: "etkili kullanım ve elegan soyutlamalar için [tasarlanmış] bir hafif soyutlama programlama dili"[26] ve "hem donanım erişimi ve hem de soyutlama desteği C++'ın temelidir. Onu diğer dillerden ayıran, bunu etkili bir biçimde yapmasıdır."[27]

Nesne saklama

C++, C'de olduğu gibi, dört farklı bellek yönetimine sahiptir: otomatik saklama süresince barındırılan nesneler, statik saklama süresince barındırılan nesneler, dinamik saklama süresince barındıran nesneler ve thread'te saklama süresince barındırılan nesneler.[28]

Otomatik saklama süresince barındırılan nesneler

Bir fonksiyon veya kapsamda (scope) tanımlanan nesneler bir stack veri yapısında tutulur. Buna göre, bir kapsama girildiğinde ({) nesnelerin tanımlanma sırasına göre yapıcı üye fonksiyon (constructor) çağrılır, kapsam terk edildiğinde (}) nesne yaşam süresinin sonuna gelinir ve tanımlanma sırasının tersi yönünde yok edici üye (destructor) çağrılır (RAII). En son tanımlanan en önce yok edilir (son giren ilk çıkar).

Statik saklama süresince barındırılan nesneler

Statik saklama sürecine sahip nesneler kapsamdan bağımsız olarak program süresince saklanır ve main() fonksiyonu çağrılmadan oluşturulup, main() bitiminden sonra tanımlama sırasının tersi yönünde yok edilir.

Dinamik saklama süresince barındırılan nesneler

Dinamik saklama sürecine sahip nesneler new çağrısıyla oluşturulur ve delete çağrısıyla yok edilir. new çağrısı tahsis edilmiş bellek alanı döndürür. C++ Core Guidelines, new ve delete yerine, tekil kaynak sahipliği için make_unique<T>, paylaşılmış kaynak sahipliği için make_shared<T> çağrılarıyla oluşturabilecek zeki işaretçilerin (smart pointer) kullanılmasını tavsiye eder.

Thread saklama süresince barındırılan nesneler

Bu saklama sürecine sahip nesneler statik saklama sürecine oldukça benzer. Temel fark, nesnelerin oluşturulması thread oluşturulmasından öncedir ve yok edilmesi thread çalışmasının bitiminden (join) sonradır.

Template

Template (Türkçeşablon) yapısı türden bağımsız derleme zamanında parameterize değişken, fonksiyon veya sınıf yazılmasına izin verir ve jenerik programlamayı, parametrik türün oluşturulmasından önce (type instantiation) tür manipulasyonuna izin veren template metaprogramlamayı, kod optimizasyonunu mümkün kılar. Template mekanizması Turing-tam'dır, böylece herhangi bir hesaplamanın bir şekilde derleme zamanında programlanarak ifade edilebilmesini sağlar.[29] Template'e geçilen parametre bir tür (type) ve türün nesnesi (non-type) olabilir.

Nesne

C++, nesne tanımlamada RAII[30](Resource Acquisition Is Initialization) tekniğini kullanır. Nesne için gerekli olan kaynak ayrımı (Resource Acquisition), tanımlandığı anda yapılır (Initialization) ve gerektiğinde deterministik olarak serbest bırakılır. Böylece kaynaklar init()/destroy(), allocate()/free(), open()/close() gibi fonksiyon çiftleriyle manuel olarak yönetilmek zorunda kalmaz.

Kapsamlama

Kapsamlama (encapsulation), veri yapısının geliştirici tarafından doğru bir şekilde kullanılacağından emin olmak için nesneye ait bilgilerin bir kısmını erişilemez yapmaktır. C++, sınıf yapısında üyelerin public, protected veya private tanımlanmasına izin verir. private üyeler yalnızca sınıfın üyeleri tarafından erişilebilir, böylece sınıfın kendisini ilgilendiren bazı üye değişken veya fonksiyonlar kullanıcıdan (client) saklanır. Ayrıca bu yolla nesnenin yaşamı süresince değişmemesi gereken durumlar (class invariant) korunabilir.

Kalıtlama

Kalıtlama (inheritence) var olan bir türün özelliklerini taşıyan yeni bir tür oluşturmayı sağlar. Temel sınıftan kalıtım, "public", "protected" ve "private" olarak ilan edilebilir. Diğer iki kalıtım türü arayüzün anlaşılmasını zorlaştırdığından çoğu zaman yalnızca public kalıtım kullanılır. Geçiş belirteci belirtilmezse, class private, struct public olarak kalıtılır.

Temel sınıftan kalıtım sanal (virtual) olarak ilan edilebilir, buna sanal kalıtım (virtual inheritence) denir. Sanal kalıtım çoklu kalıtımın problemlerinden sıyrılarak temel sınıfın yalnızca bir örneğinin kalıtım grafiğinde olmasını sağlar.

İşleçlerin ve işlevlerin fazladan yüklenmesi

C++ dilinde işleçlerin (operator) çoğu fazladan yükleme yoluyla genelleştirilebilir.[31] Örneğin + işleci sayılar için anlamlıyken, std::string sınıfı için de fazladan yüklenmiş, böylece türün temsil ettiği veriye + işleciyle birleştirilme yeteneği kazandırılmıştır. Benzer şekilde iki std::string sınıfı nesnesinin eşitliği == işleciyle kontrol edilebilir. Kullanıcı tanımlı herhangi bir tür (sınıf), işleçleri fazladan yükleyebilir.

Aynı isme sahip işlevler (function) farklı tür veya sayıda parametre alarak fazladan yüklenebilir. Örneğin std::to_string fonksiyonu int, float ve double türleri için fazladan yüklenmiştir.

Çokbiçimlilik

Çokbiçimlilik (polymorphism) kullanılarak farklı türler aynı arayüz üzerinden erişilebilir. Çokbiçimli bir tür kendisini oluşturan diğer türler gibi davranabilir. C++, dinamik (çalışma zamanında) ve statik (derleme zamanında) çokbiçimlilik çeşitlerine izin verir.

Dinamik çokbiçimlilik

Kalıtlama kullanılarak

Üst sınıfa işaret eden bir pointer veya ona ait bir referans, alt sınıfları da gösterebilir. Bu durumda üst sınıf bir çokbiçimli türdür (polymorphic type). Eğer üst sınıf bir fonksiyona referans veya pointer şeklinde parametre olarak geçilirse, ondan türetilmiş sınıflar da geçilebilir. Üst sınıf üzerinden alt sınıfların üyeleri kullanılabilir. Alt sınıflardan hangisinin geçildiği dynamic_cast kullanılarak belirlenebilir.

Sanal üye fonksiyonlar kullanarak

Türetilmiş sınıf, üst sınıfta sanal (virtual) olarak işaretlenmiş bir üye fonksiyonun içeriğini değiştirerek tekrar gerçekleyebilir (override). Bu durumda çokbiçimli tür, tekrar gerçeklenen üye fonksiyonu çağıracaktır.

Statik çokbiçimlilik

Template yapısı farklı türler için parçalı veya tam özelleştirilerek parametrik çokbiçimlilik sağlanabilir.

İşlevlerin fazladan yüklenmesi de statik çokbiçimlilik olarak düşünülebilir. Aynı isme sahip fonksiyonlar, parametre türü veya sayısına göre farklı fonksiyonları çağırır.

Lambda ifadeleri

C++ lambda ifadeleriyle anonim fonksiyon yazımını destekler.[32]

[kapma](parametreler) -> dönüş_tipi { fonksiyon_gövdesi };

dönüş_tipi düşürülebilir, bu durumda dönüş tipi gövdeden çıkarımsanır:

[kapma](parametreler) { fonksiyon_gövdesi };

Lambda parametre almıyorsa, () yapısı düşürülebilir:

[kapma]{ fonksiyon_gövdesi };

Lambda değişkene atanarak isim alabilir ve tekrar kullanılabilir:

auto func = [kapma](parametreler) { fonksiyon_gövdesi };
func(argumanlar);
func(argumanlar);

Lambda tanımlandığı anda çalıştırılıp hesaplama sonucuna erişilebilir:

auto result = [kapma](parametreler) { fonksiyon_gövdesi }(argumanlar);

C++20 ile template lambda ifadeleri yazılabilir:

[kapma] <template_parametreler> (parametreler) -> dönüş_tipi { fonksiyon_gövdesi }

Sıradışı durum yönetimi

Program çalışırken yolunda gitmeyen bir şey oluştuğunda ve programın aniden sonlandırılması arzu edilmiyorsa, sıradışı durum yönetimi (exception handling) kullanılarak ana koddan ayrı olarak yönetim sağlanabilir. Sıradışı durum (exception) oluştuğu yerde bir hata kodu fırlatır ve sıradışı durum yöneticisi (exception handler) tarafından yakalanana kadar kapsam dışana taşar. Eğer hata kodu yakalanmazsa program sonlandırılır.

Standard Kütüphane

C++ standard kütüphanesi,[33] pek çok tutucu tür, algoritma, G/Ç, dosya sistemi, string, regex, multithread, metaprogramlama araçları, hafıza yönetimi, zaman yönetimi, sıradışı durum yönetimi, çeşitli matematik fonksiyonları, rastgele sayı üreteci, C ile geriye dönük uyumluluk başlık dosyaları bulundurur.

C++ Core Guidelines

C++ Core Guidelines[34] (Türkçe, C++ Temel Yönelgeleri), C++ programcılarının daha basit, daha etkili, daha yönetilebilir kod yazmalarını sağlamayı hedefleyen yönelgeleri içeren bir projedir. Projenin editörlüğünü dilin yaratıcısı Bjarne Stroustrup ile ISO C++ Çalışma Grubu başkanı Herb Sutter sürdürür.

Core guidelines pek çok stil, iyi uygulama ve modern C++ tavsiyeleri bulundurur. Statik analiz araçları bu tavsiyeleri gerçekleyerek kod yazılırken programcıları kötü uygulamalardan kaçınmasına yardımcı olur.

Guideline Support Library (GSL),[35] Core Guidelines'ta tavsiye edilen pek çok tür ve fonksiyonu barındıran bir kütüphanedir.

Derleme modeli

C++ çoğunlukla derlenen bir dil olarak gerçeklenmiştir. Kaynak kodun derlenme süreci[36] dört aşamadan oluşur, sırasıyla; önişleme, derleme, assembly ve bağlama. Derleyici kaynak koda uygulandığında bu aşamalar birbiri ardına gerçekleşir.

  • Önişlemci (preprocessor) #include direktifiyle eklenen dosyaları koda taşır. Ayrıca kodda sözcük değişiklikleri yapabilir,[37] koşullu derleme sağlayabilir, derleyicinin bir takım özelliklerini kontrol edebilir veya kodun derleneceği platform hakkında bilgi alabilir.
  • Derleyici (compiler veya compiler proper) kodu tarar, parçalara ayırır, sözdizimi ve anlamı analiz eder, hataları bildirir, optimize eder ve işlemcinin sahip olduğu mimarinin assembly koduna derler.
  • Assembly kodu assembler tarafından yerdeğiştirebilir (relocatable object code) hedef koduna dönüştürülür.
  • Bağlayıcı (linker) yerdeğiştirebilir hedef kodunu diğer hedef kodlarına (geliştirilen veya önceden derlenmiş sistem kütüphanleri vd.) bağlar ve çalıştırılabilir hedef kodunu oluşturur.

Örnekler

Yorum Satırları

Yorum satırları derleyici tarafından çalıştırılmaz. Bunlar kodun anlaşılmasını kolaylaştırmak için eklenir.[38]

// Tek satirdan olusan bir yorum
/*
  Birden 
  fazla 
  satirdan olusan yorum
*/

Merhaba Dünya

Bu program uçbirim ekranına "Merhaba, dunya!" yazacaktır.

#include <iostream>

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

İşleçlerinin fazladan yüklenmesi

#include <iostream>

struct Complex {
  double real{};
  double imaginary{};

  Complex& operator+=(const Complex& other) {
    real += other.real, imaginary += other.imaginary;
    return *this;
  }

  Complex& operator-=(const Complex& other) {
    real -= other.real, imaginary -= other.imaginary;
    return *this;
  }

  friend std::istream& operator>>(std::istream& is, Complex& c) {
    return is >> c.real >> c.imaginary;
  }

  friend std::ostream& operator<<(std::ostream& os, const Complex& c) {
    return os << c.real << '+' << c.imaginary << 'i' << '\n';
  }
};

Complex operator+(const Complex& l, const Complex& r) {
  return Complex{l.real + r.real, l.imaginary + r.imaginary};
}

Complex operator-(const Complex& l, const Complex& r) {
  return Complex{l.real - r.real, l.imaginary - r.imaginary};
}

int main() {
  Complex c;
  std::cout << c; // 0+0i

  Complex first{1, 0};
  std::cout << first; // 1+0i

  Complex second{0, 1};
  std::cout << second; // 0+1i

  first += second;
  std::cout << first; // 1+1i

  Complex result = first + second;
  std::cout << result; // 1+2i
}

Lambda ifadeleri

#include <vector>
#include <iostream>
#include <range/v3/all.hpp>

int main() {
  using namespace ranges;
                               // .-- boş kapma
  auto                         // |  .-- parametre
  harmonic_sum = views::iota(1)// v  v       v-- dönüş tipi
               | views::transform([](int n) -> double { return 1.0 / n; })
               | views::partial_sum // lambda gövdesi-^-----------------^
               | views::take(10)
               | to<std::vector<double>>;

  for(auto [n, hn] : harmonic_sum | views::enumerate)
    std::cout << n << ' ' << hn << '\n';
}

// 0 1
// 1 1.5
// 2 1.83333
// 3 2.08333
// ...

Sıradışı durum yönetimi

#include <exception>
#include <filesystem>
#include <cstdio>

// kullanicilar std::exception'i kalitlayarak 
// kendi siradisi durum tipini tanimlar
struct appUsageError : std::exception {
  [[nodiscard]] const char *what() const noexcept override {
    return "Usage: mkdir directory";
  }
};

int main(int argc, const char *const argv[]) {
  try {
    if (argc != 2)
      throw appUsageError{};

    // noexcept degil, filesystem_error hatasi firlatabilir
    // https://en.cppreference.com/w/cpp/filesystem/create_directory
    std::filesystem::create_directory(argv[1]);

  } catch (const appUsageError &e) {
    puts(e.what());
  } catch (const std::filesystem::filesystem_error &e) {
    puts(e.what());
  } catch (const std::exception &e) {
    puts(e.what());
  }
}
// c++ -std=c++17 main.cpp -o mkdir
// ./mkdir
// Usage: mkdir directory
// ./mkdir /usr/local/Folder
// filesystem error: cannot create directory: Permission denied [/usr/local/Folder]
// ./mkdir Folder 
// # Folder adinda bir dizin hatasiz olusturuldu

Ayrıca bakınız

Kaynakça

  1. ^ "ISO/IEC 14882:1998". ISO. 15 Ocak 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Şubat 2024. 
  2. ^ "ISO/IEC 14882:2003". ISO. 13 Ocak 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Şubat 2024. 
  3. ^ "ISO/IEC 14882:2011". ISO. 30 Ocak 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Şubat 2024. 
  4. ^ "ISO/IEC 14882:2014". ISO. 29 Nisan 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Şubat 2024. 
  5. ^ "ISO/IEC 14882:2017". ISO. 29 Ocak 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Şubat 2024. 
  6. ^ "ISO/IEC 14882:2020". ISO. 16 Aralık 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Şubat 2024. 
  7. ^ "ISO/IEC PRF 14882". ISO. 28 Ocak 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Şubat 2024. 
  8. ^ "History of C++" (İngilizce). 28 Şubat 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Şubat 2024. 
  9. ^ "From the archives: "C++: as close as possible to C -- but no closer" -- A. Koenig and B. Stroustrup : Standard C++". isocpp.org. 15 Şubat 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Şubat 2024. 
  10. ^ Stroustrup, Bjarne (29 Mart 1994). Design and Evolution of C++. Addison-Wesley Professional. s. 101. ISBN 9780201543308. 4 Şubat 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Şubat 2024. 
  11. ^ a b Stroustrup, Bjarne (7 Mart 2010). "Bjarne Stroustrup's FAQ: When was C++ invented?". stroustrup.com. 6 Şubat 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Eylül 2010. 
  12. ^ Stroustrup, Bjarne. "Evolving a language in and for the real world: C++ 1991-2006" (PDF). 20 Kasım 2007 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 14 Ağustos 2013. 
  13. ^ a b c Stroustrup, Bjarne. "A History of C ++ : 1979 − 1991" (PDF). 2 Şubat 2019 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 18 Temmuz 2013. 
  14. ^ Stroustrup, Bjarne (1996). "A history of C++: 1979-1991". History of programming languages—II. ACM. ss. 699-769. doi:10.1145/234286.1057836Özgürce erişilebilir. 
  15. ^ Stroustrup, Bjarne. "The C++ Programming Language". First. 9 Ağustos 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Eylül 2010. 
  16. ^ Stroustrup, Bjarne. "The C++ Programming Language". Second. 9 Ağustos 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Eylül 2010. 
  17. ^ Sutter, Herb (30 Haziran 2016). "Trip report: Summer ISO C++ standards meeting (Oulu)". herbsutter.com. 8 Ekim 2016 tarihinde kaynağından arşivlendi. the next standard after C++17 will be C++20 
  18. ^ Dusíková, Hana (6 Kasım 2019). "N4817: 2020 Prague Meeting Invitation and Information" (PDF). 29 Aralık 2019 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 13 Şubat 2020. 
  19. ^ "Current Status". isocpp.org. 8 Eylül 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 7 Eylül 2020. 
  20. ^ "C++20 Approved -- Herb Sutter". isocpp.org. 11 Eylül 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Eylül 2020. 
  21. ^ "Computer Science Pioneer Bjarne Stroustrup to Receive the 2018 Charles Stark Draper Prize for Engineering" (Basın açıklaması). National Academy of Engineering. 3 Ocak 2018. 3 Ocak 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 14 Aralık 2021. 
  22. ^ TIOBE (January 2022). "TIOBE Index for January 2021". TIOBE.com. TIOBE Company. 25 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 2 Şubat 2022. 
  23. ^ "Bjarne Stroustrup's FAQ – Where did the name "C++" come from?". 6 Şubat 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Ocak 2008. 
  24. ^ "C For C++ Programmers". Northeastern University. 17 Kasım 2010 tarihinde kaynağından arşivlendi. Erişim tarihi: 7 Eylül 2015. 
  25. ^ "open-std.org". 27 Şubat 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 27 Şubat 2024. 
  26. ^ Stroustrup, B. (6 Mayıs 2014). "Lecture: The Essence of C++. University of Edinburgh". YouTube. 28 Nisan 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 12 Haziran 2015. 
  27. ^ B. Stroustrup (interviewed by Sergio De Simone) (30 Nisan 2015). "Stroustrup: Thoughts on C++17 - An Interview". 8 Temmuz 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Temmuz 2015. 
  28. ^ ISO/IEC. Programming Languages – C++11 Draft (n3797) 2 Ekim 2018 tarihinde Wayback Machine sitesinde arşivlendi. §3.7 Storage duration [basic.stc]
  29. ^ "Templates". 24 Mayıs 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 30 Ocak 2024. 
  30. ^ "RAII" (İngilizce). 21 Mart 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 21 Mart 2024. 
  31. ^ TylerMSFT (16 Haziran 2023). "İşleç Aşırı Yüklemesi". learn.microsoft.com. 25 Ağustos 2023 tarihinde kaynağından arşivlendi. Erişim tarihi: 25 Ağustos 2023. 
  32. ^ "Lambda". 21 Ocak 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Ocak 2024. 
  33. ^ "Standard Kütüphane". 3 Aralık 2023 tarihinde kaynağından arşivlendi. Erişim tarihi: 30 Ocak 2024. 
  34. ^ "C++ Core Guidelines" (İngilizce). 29 Şubat 2024. 29 Şubat 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Şubat 2024. 
  35. ^ "Guideline Support Library" (İngilizce). 29 Şubat 2024. 29 Şubat 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Şubat 2024. 
  36. ^ "How does the compilation linking process work?". 10 Şubat 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 9 Şubat 2024. 
  37. ^ TylerMSFT (16 Haziran 2023). "Ön işlemci dil bilgisi özeti (C/C++)". learn.microsoft.com. 25 Ağustos 2023 tarihinde kaynağından arşivlendi. Erişim tarihi: 25 Ağustos 2023. 
  38. ^ "Yorum satırı". 28 Kasım 2023 tarihinde kaynağından arşivlendi. Erişim tarihi: 30 Ocak 2024. 

Dış bağlantılar

Vikikitap
Vikikitap
Vikikitapta bu konu hakkında daha fazla bilgi var:

İlgili Araştırma Makaleleri

<span class="mw-page-title-main">C (programlama dili)</span> programlama dili

C, yapısal bir programlama dilidir. Bell Laboratuvarları'nda, Ken Thompson ve Dennis Ritchie tarafından UNIX işletim sistemini geliştirebilmek amacıyla B dilinden türetilmiştir. Geliştirilme tarihi 1972 olmasına rağmen yaygınlaşması Brian Kernighan ve Dennis M. Ritchie tarafından yayımlanan "C Programlama Dili" kitabından sonra hızlanmıştır. Günümüzde neredeyse tüm işletim sistemlerinin yapımında %95'lere varan oranda kullanılmış, hâlen daha sistem, sürücü yazılımı, işletim sistemi modülleri ve hız gereken her yerde kullanılan oldukça yaygın ve sınırları belirsiz oldukça keskin bir dildir. Keskinliği, programcıya sonsuz özgürlüğün yanında çok büyük hatalar yapabilme olanağı sağlamasıdır. Programlamanın gelişim süreciyle beraber programlamanın karmaşıklaşması, gereksinimlerin artması ile uygulama programlarında nesne yönelimliliğin ortaya çıkmasından sonra C programcıları büyük ölçüde nesne yönelimliliği destekleyen C++ diline geçmişlerdir.

<span class="mw-page-title-main">Bjarne Stroustrup</span>

Bjarne Stroustrup C++ programlama dilini yaratması ve geliştirmesiyle bilinen Danimarkalı bir bilgisayar bilimcisidir. Columbia Üniversitesi'nde misafir öğretim üyesi ve Morgan Stanley'de Yönetici Direktör olarak çalışmaktadır.

<span class="mw-page-title-main">JavaScript</span> programlama dili

JavaScript, HTML ve CSS ile birlikte World Wide Web'in temel teknolojilerinden biri olan programlama dilidir. Web sitelerinin %97'sinden fazlası, web sayfası hareketleri için istemci tarafında JavaScript kullanırlar ve kullanılan kodlar genellikle üçüncü taraf kitaplıkları içerir. Tüm büyük web tarayıcılarında, kaynak kodunu kullanıcıların cihazlarında yürütebilmek için özel bir JavaScript motoru bulunur.

<span class="mw-page-title-main">C♯</span> programlama dili

C#; Microsoft tarafından .NET Teknolojisi için geliştirilen modern bir programlama dilidir. Sözdizimi C-like bir deneyim sunar.

Python, nesne yönelimli, yorumlamalı, birimsel (modüler) ve etkileşimli yüksek seviyeli bir programlama dilidir.

Şablon Metaprogramlama, C++ programlama dilinde derleme zamanında hesaplama yapan programlar yazmaktır.

<span class="mw-page-title-main">Nesne yönelimli programlama</span> nesne kavramına dayalı programlama paradigması

Nesne yönelimli programlama veya kısaca NYP, Her işlevin nesneler olarak soyutlandığı bir programlama yaklaşımıdır. NYP destekleyen programlama dilleri yüksek seviye diller olarak adlandırılır.

<span class="mw-page-title-main">Monte Carlo yöntemi</span>

Monte Carlo benzetimi, çok sayıda tekrarlanan rastgele örneklemelerle, bir takım nümerik sonuçlar elde etmeye yarayan ve bilimin birçok alanında yaygın olarak kullanılan bir sayısal hesaplama algoritmaları sınıfıdır. Stokastik olayların yer aldığı fiziksel süreçlerin sonuçlarının tahmin edilmesinde çok kullanışlıdır. Ayrıca, rastgele seçimlerin işe yaradığı ve prensipte deterministik olan bir takım problemlerin çözümünde de kullanılmaktadır. Monte-Carlo yöntemi, Nicholas Constantine Metropolis (1915-1999) tarafından bulunmuştur ve Atom bombasının geliştirildiği Los Alamos Ulusal Labratuvarında, bombanın patlamasından sonra dağılan nötronlara karşı kalkan modellemek için Stanislaw Ulam tarafından günümüze taşınmıştır.

<span class="mw-page-title-main">Merhaba dünya programı</span> Geleneksel acemi bilgisayar programı

Merhaba dünya programı, görsel bir arayüz veya komut satırında "Merhaba dünya!" yazdıran bilgisayar programıdır. Bunun amacı, yeni öğrenilen programlama dilinde basit bir yazı yazmak ve programlama mantığını anlatmaktır.

Çokbiçimlilik, bir türün bir başka tür gibi davranabilme ve bu tür gibi kullanılabilme özelliğidir. Nesne yönelimli programlama dillerinde çokbiçimlilik özelliği ise aynı temel sınıftan türetilmiş olan sınıflarda paylaşılan, başka bir ifadeyle aşırı yüklenen aynı metodun bu sınıflarda farklı şekillerde uyarlanabilmesidir. Nesnenin davranışı çalışma anında belirlendiği için programcılar, çokbiçimlilik özelliği sayesinde nesnelerin türünü önceden bilmek zorunda kalmaz.

<span class="mw-page-title-main">Kalıtım (programlama)</span>

Kalıtım, bir sınıfın üst sınıftan miras almasına denir. Pratikte karışıklıklara sebep olduğundan kimi programlama dilleri, ancak tekli kalıtıma izin verirler. Bu dillerde çoklu kalıtım yerine interface denilen nesnelerden faydalanılarak çoklu kalıtımın verdiği özellikler, yan etkileri olmaksızın kullanılabilmektedir. Çoklu kalıtıma izin veren programlama dillerindeyse doğrudan bir sınıfın birden fazla sınıftan miras alması mümkündür..

Bilgisayar programlamada dinamik iletim, altyordam çağrılarının ilişkin altyordam başlangıç adresine dinamik olarak bağlanmasıdır. Bir diğer deyişle, dinamik iletim program metnindeki bir çağrı ile işletilen altyordamın programın çalışması sırasında birbirine bağlanması durumudur. Geri çağrı ve çokbiçimliliğin realize edilmesinde kullanılan bu bağlama yöntemi, yordamsal programlama dillerinde altyordam göstericileriyle gerçekleştirilirken, nesne yönelimli dillerde kalıtlama ve gerçekleştirme ilişkilerinin kullanılmasıyla otomatikman sağlanır. Altyordamların birinci sınıf dil öğesi olarak ele alındığı fonksiyonel programlama dillerinde ise, aynı işlevsellik altyordamların argüman olarak geçirilmesi ile sağlanabilir.

Nesne yönelimli programlama dillerinde arayüz, değişik sınıflardan nesnelerin kategorize edilmesini sağlayan bir soyut tür çeşitidir. Tanımlanmakta olan kategorinin birbirleriyle alakasız sınıfları ortak bir çatı altında toplaması nedeniyle, arayüz tanımları, soyut sınıfların aksine, listeledikleri iletilerin gerçekleştirim ayrıntısı olan herhangi bir bilgi içeremezler. Dolayısıyla, bir arayüz tanımı iletilere karşılık gelen bir altyordam gövdesi veya altalan tanımı içeremez. Bir başka açıdan bakarsak, arayüz tanımında yer alan programlama öğelerinin zaman içinde değişme olasılığı düşük öğeler olması gerekir. Buna göre, arayüz tanımları gerçekleştirimci ile kullanıcının paylaştığı ve sabit olma özelliği bulunan altyordam imzaları ile simgesel sabit tanımlarını barındırabilir.

<span class="mw-page-title-main">OpenCL</span>

OpenCL,, Apple tarafından 2008 yılında kâr amacı gütmeyen teknoloji şirketleri birliği Khronos Group'a önerilen, kabul gördükten sonra spesifikasyonu pek çok şirketin katkılarıyla hazırlanan heterojen hesaplama platformudur. OpenCL; destekli grafik işlemcileri, genel amaçlı işlemciler ve FPGA ler gibi farklı platformlarda hesaplama yapılmasına olanak sağlar. OpenCL AMD, Intel, NVIDIA ve ARM tarafından desteklenmektedir. Ayrıca OpenCL kullanılarak Sony Playstation cihazlarında kullanılan Cell işlemcilerde de hesaplama yapılabilmektedir.

Bilgisayar biliminde boş işaretçi, sıfır referansı veya boş gösterici, geçerli bir nesne adresini göstermeyen işaretçi ya da dolaylamaya verilen genel isimdir. Bir başka deyişle, değeri sıfır olan işaretçidir; yani bilgisayarın belleğinde geçerli olan bir adresi işaret etmemektedir. Bilgisayar programlarında, uzunluğu bilinmeyen bir listenin sonu veya bazı eylemlerin gerçekleştirilememesi gibi koşulları göstermek için rutin olarak boş işaretçiler kullanır; boş işaretçilerinin bu kullanımı, sıfırlanabilir tip veya opsiyonel bir veri tipi gibi düşünülebilir.

<span class="mw-page-title-main">Carbon (programlama dili)</span>

Carbon, Google tarafından "C++ Ardıl Dili" olarak oluşturulmuş deneysel bir genel amaçlı programlama dilidir. İlk olarak 2022 yılının Temmuz ayında Carruth Chandler tarafından CppNorth konferansında halka sunuldu. Dil, C++'ın belirlenen çeşitli eksikliklerini düzeltmeyi amaçlar, ancak bunun dışında benzer bir özellik seti de sağlar. Hedeflerinden biri, mevcut C++ kodu ile beraber çift yönlü birlikte çalışabilirliktir. Dil, C++'ın kullandığı ISO sürecinin aksine GitHub üzerinde tasarlanacak ve geliştirilecektir. Dil, Apache Lisansı altında ücretsiz ve açık kaynaklı bir proje olarak geliştirilmiştir.

Tanımsız durum, programlamada bir standartın bir durumu tanımlayamacağı durumlara denmektedir.

C++ Standard Kütüphanesi, C++ programlama dilinde ve C++ ISO Standard'ıyla yazılmış sınıfların ve fonksiyonların koleksiyonudur.

C++17, C++ programlama dili için yayınlanan ISO/IEC 14882 standardının bir versiyonudur. C++17, bir önceki C++ standardı olan C++14'ün yerine geçmiş, sonrasında C++20 ile yerdeğiştirmiştir.

C23, C programlama dilinin açık standard taslağıdır ve ISO/IEC 9899:2024 olarak yayınlanması ve C17'nin yerini alması beklenmektedir. 2016'da gayriresmi olarak C2x ve adıyla üzerinde çalışılmaya başlanmıştır ve Ekim 2024'te yayınlanması beklenmektedir. C23'ün en son taslağı 1 Nisan 2023'te yayınlanmıştır ve genel erişime açıktır. WG14 C2x taslağı için ilk olarak Ekim 2019 toplanmış, 2020'te COVID-19 pandemisi nedeniyle toplantılar sanal olarak uzaktan yapılmış, sonrasında telekonferans toplantıları 2024 boyunca devam etmiştir. Haziran 2024'teki açık standardta 'C23'ün bitiminden sonra, "C2y" olarak adlandırıldığı' belirtilmiştir.