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.
Ushbu bo‘lim mundarijasi
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? #
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.
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.
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.
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 #
| Soha | Misollar |
|---|---|
| Ma'lumotlar bazalari | MySQL, MongoDB, ClickHouse |
| Brauzerlar | Chrome, Firefox ning asosiy qismi |
| O'yin dvigatellari | Unreal Engine, Godot |
| Operatsion tizimlar | Windows komponentlari, drayverlar |
| Moliya | Yuqori chastotali savdo tizimlari |
| Sun'iy intellekt | PyTorch va TensorFlow yadrosi |
| O'rnatilgan tizimlar | Avtomobil, aviatsiya, tibbiy uskunalar |
Umumiy jihat bitta: tezlik va resurs ustidan nazorat muhim bo'lgan joylar.
Birinchi dastur #
#include <print>
#include <string>
#include <vector>
#include <algorithm>
int main()
{
std::println("Salom, dunyo!");
return 0;
}
Salom, dunyo!
std::println - C++23 dagi yangilikUzoq vaqt C++ da chiqarish ikki xil bo'lgan:
| Usul | Qachondan | Kamchiligi |
|---|---|---|
printf("%d\n", x) | C dan meros | Turlar tekshirilmaydi |
std::cout << x << "\n" | C++98 | Uzun, 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:
#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;
}
printf: yosh = 25
cout: yosh = 25
println: yosh = 25
C va C++ farqi #
C++ C dan o'sib chiqqan, lekin u boshqa til.
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;
}
qo'lda: 0 1 4 9 16
vector: [0, 1, 4, 9, 16]
Farq kim javobgar ekanida:
new/delete | std::vector | |
|---|---|---|
| Xotira ajratish | Siz | Vector |
| Xotirani bo'shatish | Siz | Vector |
| Istisno chiqsa | Xotira sizadi | Bo'shatiladi |
return erta bo'lsa | Xotira sizadi | Bo'shatiladi |
| Hajmni o'zgartirish | Qo'lda realloc | push_back |
| Chegaradan chiqish | Aniqlanmaydi | .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 #
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;
}
C++98: ["Aziza", "Husanboy", "Malika", "Nodira"]
C++20: ["Bekzod", "Dilnoza", "Kamola"]
eng uzun: Husanboy
Internetdagi C++ materiallarining katta qismi 2005-2010 yillarga tegishli. Ular quyidagilarni o'rgatadi:
| Eski uslub | Zamonaviy muqobil | Bo'lim |
|---|---|---|
new / delete | std::vector, std::unique_ptr | 9, 10 |
| Xom ko'rsatkichlar (egalik bilan) | Egalikni ifodalovchi turlar | 10 |
char* satrlar | std::string, std::string_view | 6 |
NULL | nullptr | 3 |
| Xato kodlari | std::optional, std::expected | 16 |
typedef | using | 3 |
| Qo'lda halqalar | Algoritmlar va ranges | 8 |
| Meros bilan qayta ishlatish | Kompozitsiya, shablonlar | 14, 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.
Nolinchi narxli abstraksiya #
#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;
}
qo'lda: 55
algoritm: 55
diapazon: 55
uchalasi teng: true
-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 halqa | Algoritm |
|---|---|
| Indeks xatosi mumkin | Indeks umuman yo'q |
| Niyat kodda ko'rinmaydi | accumulate - nom o'zi aytadi |
| Optimallashtirish sizdan | Kutubxona mualliflaridan |
Muhim shart: optimallashtirishni yoqish. -O0 bilan
abstraksiyalar haqiqatan sekinroq ishlaydi. Bu 2-bo'limda
ko'riladi.
Til qanchalik katta #
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;
}
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
C++ standarti 2000 sahifadan ortiq. Uni to'liq biladigan odam deyarli yo'q - til mualliflari ham.
Amaliy yondashuv:
| O'rganish kerak | Kutish mumkin |
|---|---|
| Qiymat semantikasi va havolalar | Shablon metadasturlash |
| RAII va egalik | Koruntinalar |
| Konteynerlar va algoritmlar | Modullar (hali beqaror) |
| Nusxa/ko'chirish | Ko'p merosli virtual bazalar |
optional, expected | Custom allocator lar |
| Asosiy shablonlar | SFINAE 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 #
| Talab | Izoh |
|---|---|
| Biror tilda dasturlash tajribasi | Sikl, funksiya, shart nimaligini bilish |
| C ni bilish | Shart emas, lekin foydali |
| Ko'rsatkichlar tushunchasi | 10-bo'limda qaytadan ko'riladi |
| Sabr | Kompilyator 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'limlar | Mavzu |
|---|---|
| 1-2 | Tanishuv, muhitni sozlash |
| 3-5 | Turlar, havolalar, funksiyalar |
| 6-8 | Satrlar, konteynerlar, algoritmlar |
| 9-10 | RAII va egalik - darslikning markazi |
| 11-13 | Sinflar, nusxa/ko'chirish, operatorlar |
| 14-15 | Polimorfizm, shablonlar va konseptlar |
| 16-18 | Xatolar, standart kutubxona, ko'p oqimlilik |
| 19 | Aniqlanmagan xulq-atvor va uni topish |
| 20 | Amaliy loyiha |
- C++ ishlatiladigan beshta sohani sanang.
- "Salom, dunyo" dasturini yozing va ishga tushiring.
- Xuddi shu narsani
printf,coutvaprintlnbilan chiqaring. new int[5]bilan massiv yarating vadelete[]ni ataylab unuting.- Xuddi shu ishni
std::vectorbilan bajaring. - Ikkala usulda "kim xotirani bo'shatadi" degan savolga javob yozing.
std::sortvastd::ranges::sortni solishtiring.- Yig'indini uch xil usulda hisoblab, natijalar tengligini tekshiring.
- C++ standartlari jadvalini chiqaring.
- 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)printfning qisqaligini turlar xavfsizligi bilan birlashtiradi.new/deleteo'rnigastd::vector- xotirani konteyner o'zi boshqaradi.- Istisno yoki erta
returnbo'lsa, qo'lda yozilgandeletechaqirilmaydi. - 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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.