1-bo‘lim

C++ bilan tanishuv

C++ ni kim va nima uchun yaratgan, u qaysi masalalarni yechadi, C dan nimasi bilan farq qiladi va nima uchun "zamonaviy C++" alohida atama.

🕑 9 daqiqa o‘qish 📄 485 so‘z 👁 6 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. C++ ni kim yaratgan?
  2. C++ qayerda ishlatiladi
  3. Birinchi dastur
  4. C va C++ farqi
  5. "Zamonaviy C++" nima degani
  6. Nolinchi narxli abstraksiya
  7. Til qanchalik katta
  8. Bu darslik kimga
  9. Darslik tarkibi
  10. Xulosa

C++ - o'yin dvigatellari, ma'lumotlar bazalari, brauzerlar va moliyaviy tizimlar yozilgan til.

Uning obro'si murakkablik bilan bog'liq. Bu qisman haqiqat - lekin zamonaviy C++ 2000-yillardagi C++ dan sezilarli farq qiladi.

C++ ni kim yaratgan? #

C++

Bjarne Stroustrup (1950-)

Daniyalik informatika olimi. Kembrijdagi doktorlik ishida u Simula tilida katta dastur yozgan va ikki narsani bir vaqtda his qilgan: Simulaning sinflari murakkab dasturni tartibga solishda ajoyib, lekin tilning o'zi ishlatib bo'lmas darajada sekin. Keyin u BCPL da ishlagan - tez, lekin hech qanday tuzilma yo'q.

1979-yilda Bell Labs ga kelib, u shu ikki tajribani birlashtirishga kirishdi: C ning tezligi va Simulaning sinflari. Til avvaliga "C with Classes" ("sinfli C") deb atalgan.

Nom qayerdan kelgan?

1983-yilda til rasmiy nom oldi. ++ - bu C dagi birga oshirish operatori: i++ "i ni bittaga oshir" degani.

Ya'ni C++ = "C, bir pog'ona yuqori". Nomni Bell Labs xodimi Rick Mascitti taklif qilgan.

Stroustrupning o'zi bu haqda hazillashgan: agar til ++C deb atalganida, hozirgidan ko'ra ko'proq "yangi" eshitilardi - chunki ++i avval oshiradi, keyin qiymat beradi.

C++ ning yo'li 1979 C with Classes 1983 C++ nomi 1985 Birinchi nashr 1998 C++98 - ISO 2011 C++11 - burilish 2020 C++20 2023 C++23 - biz shu yerda Eski C++ (1985-2010) - qo'lda xotira boshqaruvi Zamonaviy C++ (2011-) - avtomatik egalik 1998-yildan beri til xalqaro ISO standarti - bir kompaniya emas, qo'mita boshqaradi. 2011-yildan beri yangi standart har uch yilda chiqadi.
Qirq yildan ortiq tarix - lekin uning yarmi bizga bevosita aloqador emas

Vaqt chizig'idagi eng muhim nuqta - 2011-yil. Stroustrupning o'zi C++11 haqida shunday degan: u "yangi tildek his qilinadi". Bu bo'rttirish emas: auto, lambda ifodalari, ko'chirish semantikasi va aqlli ko'rsatkichlar kundalik kod ko'rinishini butunlay o'zgartirdi.

Aynan shuning uchun bu darslik C++23 dan boshlaydi va eski uslubni faqat taqqoslash uchun ko'rsatadi.

Loyihaning asosiy qoidasi

Stroustrup tilni loyihalashda bitta tamoyilga qat'iy amal qilgan:

Ishlatmagan narsangiz uchun to'lamaysiz.

Ya'ni C++ ga qo'shilgan har qanday imkoniyat undan foydalanmagan dasturni sekinlashtirmasligi kerak. Istisnolar, sinflar, shablonlar - hammasi shu shart bilan qabul qilingan.

Bu tamoyil tilning ham kuchli, ham murakkab bo'lishini tushuntiradi: qulaylik uchun tezlikdan voz kechish taklif qilinganda, javob deyarli har doim "yo'q" bo'lgan.

Quyida, "Nolinchi narxli abstraksiya" bo'limida bu tamoyilni amalda tekshirib ko'ramiz.

C++ qayerda ishlatiladi #

SohaMisollar
Ma'lumotlar bazalariMySQL, MongoDB, ClickHouse
BrauzerlarChrome, Firefox ning asosiy qismi
O'yin dvigatellariUnreal Engine, Godot
Operatsion tizimlarWindows komponentlari, drayverlar
MoliyaYuqori chastotali savdo tizimlari
Sun'iy intellektPyTorch va TensorFlow yadrosi
O'rnatilgan tizimlarAvtomobil, aviatsiya, tibbiy uskunalar

Umumiy jihat bitta: tezlik va resurs ustidan nazorat muhim bo'lgan joylar.

Birinchi dastur #

C++
#include <print>
#include <string>
#include <vector>
#include <algorithm>
C++
int main()
{
    std::println("Salom, dunyo!");
    return 0;
}
Natija
Salom, dunyo!
std::println - C++23 dagi yangilik

Uzoq vaqt C++ da chiqarish ikki xil bo'lgan:

UsulQachondanKamchiligi
printf("%d\n", x)C dan merosTurlar tekshirilmaydi
std::cout << x << "\n"C++98Uzun, formatlash noqulay
std::println("{}", x)C++23-

Uchinchisi ikkalasining kamchiligini yechadi: u printf kabi qisqa, lekin turlarni kompilyatsiya paytida tekshiradi.

Ushbu darslikda std::println ishlatiladi. Agar sizning kompilyatoringiz uni qo'llab-quvvatlamasa, 2-bo'limda muqobil yo'l ko'rsatilgan.

Uchala usulni yonma-yon ko'ramiz:

C++
#include <cstdio>
#include <iostream>

int main()
{
    int yosh = 25;

    std::printf("printf:   yosh = %d\n", yosh);
    std::cout << "cout:     yosh = " << yosh << "\n";
    std::println("println:  yosh = {}", yosh);

    return 0;
}
Natija
printf:   yosh = 25
cout:     yosh = 25
println:  yosh = 25

C va C++ farqi #

C++ C dan o'sib chiqqan, lekin u boshqa til.

C++
int main()
{
    // C uslubi - qo'lda xotira boshqarish
    int* eskiUsul = new int[5];
    for (int i = 0; i < 5; i++) {
        eskiUsul[i] = i * i;
    }
    std::print("qo'lda:  ");
    for (int i = 0; i < 5; i++) {
        std::print("{} ", eskiUsul[i]);
    }
    delete[] eskiUsul;        // UNUTILSA - xotira sizib chiqadi
    std::println("");

    // C++ uslubi - xotira o'zi boshqariladi
    std::vector<int> yangiUsul;
    for (int i = 0; i < 5; i++) {
        yangiUsul.push_back(i * i);
    }
    std::println("vector:  {}", yangiUsul);
    // delete kerak emas - vector o'zini o'zi tozalaydi

    return 0;
}
Natija
qo'lda:  0 1 4 9 16 
vector:  [0, 1, 4, 9, 16]
Ikkala kod bir xil ishni qiladi

Farq kim javobgar ekanida:

new/deletestd::vector
Xotira ajratishSizVector
Xotirani bo'shatishSizVector
Istisno chiqsaXotira sizadiBo'shatiladi
return erta bo'lsaXotira sizadiBo'shatiladi
Hajmni o'zgartirishQo'lda reallocpush_back
Chegaradan chiqishAniqlanmaydi.at() tekshiradi

Uchinchi va to'rtinchi qatorlar eng muhim. delete[] ni yozgan bo'lsangiz ham, undan oldin istisno chiqsa yoki return bajarilsa - u chaqirilmaydi.

Bu RAII tamoyilining asosi va u 9-bo'limning mavzusi. Butun darslik shu g'oya atrofida quriladi.

"Zamonaviy C++" nima degani #

C++
int main()
{
    std::vector<std::string> ismlar{
        "Nodira", "Husanboy", "Malika", "Aziza"
    };

    // C++98 uslubi
    std::sort(ismlar.begin(), ismlar.end());
    std::println("C++98:  {}", ismlar);

    // C++20 uslubi - ranges
    std::vector<std::string> boshqa{"Kamola", "Dilnoza", "Bekzod"};
    std::ranges::sort(boshqa);
    std::println("C++20:  {}", boshqa);

    // C++20 - eng uzun ismni topish
    auto engUzun = std::ranges::max_element(ismlar,
        [](const std::string& a, const std::string& b) {
            return a.size() < b.size();
        });
    std::println("eng uzun: {}", *engUzun);

    return 0;
}
Natija
C++98:  ["Aziza", "Husanboy", "Malika", "Nodira"]
C++20:  ["Bekzod", "Dilnoza", "Kamola"]
eng uzun: Husanboy
Eski darsliklardan ehtiyot bo'ling

Internetdagi C++ materiallarining katta qismi 2005-2010 yillarga tegishli. Ular quyidagilarni o'rgatadi:

Eski uslubZamonaviy muqobilBo'lim
new / deletestd::vector, std::unique_ptr9, 10
Xom ko'rsatkichlar (egalik bilan)Egalikni ifodalovchi turlar10
char* satrlarstd::string, std::string_view6
NULLnullptr3
Xato kodlaristd::optional, std::expected16
typedefusing3
Qo'lda halqalarAlgoritmlar va ranges8
Meros bilan qayta ishlatishKompozitsiya, shablonlar14, 15

Bu ro'yxatning o'ng ustuni xavfsizroq va qisqaroq. Chap ustun esa hali ham ishlaydi - shuning uchun u o'rgatilishda davom etadi.

Ushbu darslik o'ng ustunni o'rgatadi, chap ustunni esa nima uchun tashlab ketilgani bilan birga ko'rsatadi.

C++ nima uchun mavjud C Tez, uskunaga yaqin Kichik ish vaqti Toliq nazorat Hamma narsa qo'lda xotira, satr, konteyner - xatoga juda ochiq Python, Java, C# Xavfsiz, qulay Xotira avtomatik Boy kutubxona Ish vaqti kerak axlat yig'uvchi, kechikish - nazorat cheklangan C++ C ning tezligi + yuqori darajali abstraksiyalar ish vaqtisiz "Nolinchi narxli abstraksiya" Ishlatmagan narsangiz uchun to'lamaysiz. Ishlatgan narsangiz esa qo'lda yozganingizdan sekinroq emas. Bu C++ ning asosiy va'dasi - va u aksariyat hollarda bajariladi. Narxi Til katta, kompilyatsiya sekin, xatolar aniqlanmagan xulq-atvorga olib keladi (19-bo'lim).
C++ ikki dunyo o'rtasida turadi - va shuning uchun murakkab

Nolinchi narxli abstraksiya #

C++
#include <numeric>

int main()
{
    std::vector<int> sonlar{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    // Qo'lda halqa
    int qolda = 0;
    for (std::size_t i = 0; i < sonlar.size(); ++i) {
        qolda += sonlar[i];
    }

    // Standart algoritm
    int algoritm = std::accumulate(sonlar.begin(), sonlar.end(), 0);

    // Ranges (C++20)
    int diapazon = 0;
    for (int x : sonlar) {
        diapazon += x;
    }

    std::println("qo'lda:    {}", qolda);
    std::println("algoritm:  {}", algoritm);
    std::println("diapazon:  {}", diapazon);
    std::println("uchalasi teng: {}",
                 qolda == algoritm && algoritm == diapazon);

    return 0;
}
Natija
qo'lda:    55
algoritm:  55
diapazon:  55
uchalasi teng: true
Uchala variant bir xil mashina kodiga aylanadi

-O2 optimallashtirish bilan kompilyator uchala variantdan ham deyarli bir xil kod chiqaradi.

Bu nolinchi narxli abstraksiya tamoyili: yuqori darajali yozuv ish vaqtida qo'shimcha xarajat keltirmaydi.

Shuning uchun C++ da o'qish uchun qulay kod yozish tezlikni qurbon qilmaydi. Aksincha:

Qo'lda halqaAlgoritm
Indeks xatosi mumkinIndeks umuman yo'q
Niyat kodda ko'rinmaydiaccumulate - nom o'zi aytadi
Optimallashtirish sizdanKutubxona mualliflaridan

Muhim shart: optimallashtirishni yoqish. -O0 bilan abstraksiyalar haqiqatan sekinroq ishlaydi. Bu 2-bo'limda ko'riladi.

Til qanchalik katta #

C++
int main()
{
    struct Standart {
        const char* nom;
        int yil;
        const char* asosiy;
    };

    Standart standartlar[] = {
        {"C++98", 1998, "STL, shablonlar, istisnolar"},
        {"C++11", 2011, "auto, lambda, move, smart pointer"},
        {"C++14", 2014, "kichik tuzatishlar"},
        {"C++17", 2017, "optional, string_view, filesystem"},
        {"C++20", 2020, "ranges, concepts, modules, coroutine"},
        {"C++23", 2023, "print, expected, mdspan"},
    };

    std::println("{:<8} {:<6} {}", "STANDART", "YIL", "ASOSIY YANGILIK");
    std::println("{}", std::string(58, '-'));

    for (const auto& s : standartlar) {
        std::println("{:<8} {:<6} {}", s.nom, s.yil, s.asosiy);
    }

    std::println("");
    std::println("Bu darslik: C++17/20/23");

    return 0;
}
Natija
STANDART YIL    ASOSIY YANGILIK
----------------------------------------------------------
C++98    1998   STL, shablonlar, istisnolar
C++11    2011   auto, lambda, move, smart pointer
C++14    2014   kichik tuzatishlar
C++17    2017   optional, string_view, filesystem
C++20    2020   ranges, concepts, modules, coroutine
C++23    2023   print, expected, mdspan

Bu darslik: C++17/20/23
Hamma narsani o'rganish shart emas

C++ standarti 2000 sahifadan ortiq. Uni to'liq biladigan odam deyarli yo'q - til mualliflari ham.

Amaliy yondashuv:

O'rganish kerakKutish mumkin
Qiymat semantikasi va havolalarShablon metadasturlash
RAII va egalikKoruntinalar
Konteynerlar va algoritmlarModullar (hali beqaror)
Nusxa/ko'chirishKo'p merosli virtual bazalar
optional, expectedCustom allocator lar
Asosiy shablonlarSFINAE nozikliklari

Chap ustun kundalik kod uchun yetarli. O'ng ustun kutubxona mualliflari uchun.

Ushbu darslik chap ustunni qamraydi va o'ng ustundan faqat nima uchun mavjudligini aytadi.

Bu darslik kimga #

TalabIzoh
Biror tilda dasturlash tajribasiSikl, funksiya, shart nimaligini bilish
C ni bilishShart emas, lekin foydali
Ko'rsatkichlar tushunchasi10-bo'limda qaytadan ko'riladi
SabrKompilyator xatolari uzun bo'ladi

Agar C ni bilmasangiz - hech qisi yo'q. Zamonaviy C++ da xom ko'rsatkichlar bilan kamdan-kam ishlanadi.

Agar C ni yaxshi bilsangiz - ba'zi odatlarni unutish kerak bo'ladi. Bu ko'pincha noldan o'rganishdan qiyinroq.

Darslik tarkibi #

Bo'limlarMavzu
1-2Tanishuv, muhitni sozlash
3-5Turlar, havolalar, funksiyalar
6-8Satrlar, konteynerlar, algoritmlar
9-10RAII va egalik - darslikning markazi
11-13Sinflar, nusxa/ko'chirish, operatorlar
14-15Polimorfizm, shablonlar va konseptlar
16-18Xatolar, standart kutubxona, ko'p oqimlilik
19Aniqlanmagan xulq-atvor va uni topish
20Amaliy loyiha
Amaliy topshiriq
  1. C++ ishlatiladigan beshta sohani sanang.
  2. "Salom, dunyo" dasturini yozing va ishga tushiring.
  3. Xuddi shu narsani printf, cout va println bilan chiqaring.
  4. new int[5] bilan massiv yarating va delete[] ni ataylab unuting.
  5. Xuddi shu ishni std::vector bilan bajaring.
  6. Ikkala usulda "kim xotirani bo'shatadi" degan savolga javob yozing.
  7. std::sort va std::ranges::sort ni solishtiring.
  8. Yig'indini uch xil usulda hisoblab, natijalar tengligini tekshiring.
  9. C++ standartlari jadvalini chiqaring.
  10. Eski va zamonaviy uslub jadvalidan uchtasini o'z so'zlaringiz bilan tushuntiring.

Xulosa #

  • C++ ni Bjarne Stroustrup 1979-yilda Bell Labs da yarata boshlagan; 1983-yilda til shu nomni olgan.
  • G'oya - C ning tezligini Simuladan olingan sinflar bilan birlashtirish.
  • 1998-yildan beri til ISO standarti, 2011-yildan beri har uch yilda yangilanadi.
  • C++11 burilish nuqtasi: undan keyingi til "zamonaviy C++" deb ataladi.
  • Asosiy tamoyil - ishlatmagan narsangiz uchun to'lamaysiz.
  • C++ tezlik va nazorat muhim bo'lgan sohalarda ishlatiladi.
  • U C dan o'sib chiqqan, lekin boshqa til va boshqacha yoziladi.
  • std::println (C++23) printf ning qisqaligini turlar xavfsizligi bilan birlashtiradi.
  • new/delete o'rniga std::vector - xotirani konteyner o'zi boshqaradi.
  • Istisno yoki erta return bo'lsa, qo'lda yozilgan delete chaqirilmaydi.
  • Zamonaviy C++ eski materiallardan sezilarli farq qiladi.
  • Nolinchi narxli abstraksiya: yuqori darajali yozuv ish vaqtida qimmatga tushmaydi.
  • Bu faqat optimallashtirish yoqilganda amal qiladi.
  • Til juda katta - kundalik ish uchun uning kichik qismi yetarli.
  • Darslikning markazi - RAII va egalik (9-10-bo'limlar).

Keyingi bo'limda muhitni sozlaymiz va kompilyator bayroqlarini o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.