C++

Gjuha e shpejtë që mësohet në shumë gjimnaze e fakultete, dhe që qëndron pas lojërave, shfletuesve dhe garave të programimit. · 54 terma

#include

#include i thotë kompajlerit ta fusë një skedar tjetër në kodin tënd para se ta përkthejë — zakonisht një librari si <iostream> ose <vector>, ose një header tëndin si "loja.h". Pa të, s'mund t'i përdorësh ato funksione.

Address-of (&) and dereference (*)

Adresa dhe vlera e pointer-it

Te pointer-ët, & e merr adresën e një variable në memorie, ndërsa * shkon te ajo adresë dhe merr (ose ndryshon) vlerën që gjendet aty. int* p = &x; do të thotë „p mban adresën e x-it“.

Arduino

Arduino-ja është një pllakë e vogël elektronike që e programon me një version të thjeshtë të C++ për të kontrolluar drita, motorë dhe sensorë. Është mënyra më e njohur për të filluar me robotikë dhe pajisje „smart“ në shkollë.

Arrays in C++

Vargjet në C++

Një varg (array) në C++ mban një numër të fiksuar elementesh të të njëjtit tip, njëri pas tjetrit në memorie. Madhësia vendoset që në fillim dhe s'ndryshon, dhe C++ nuk të ndal po dole jashtë kufijve — ndaj shpesh përdoret vector-i.

auto (C++)

auto i thotë kompajlerit „gjeje vetë tipin nga vlera“. Ndihmon sidomos kur tipi është i gjatë, si te iteratorët. Tipi mbetet i fiksuar — thjesht s'ke pse e shkruan.

C++

C++ është një gjuhë programimi shumë e shpejtë, që të jep kontroll të madh mbi kompjuterin dhe memorien. Përdoret për lojëra video dhe programe që duhet të jenë shumë të shpejta, dhe shpesh mësohet në gjimnaz e fakultet.

C++ data types (int, double, char, bool)

Tipet e të dhënave në C++

Në C++ çdo variabël duhet ta ketë tipin e shkruar: int për numra të plotë, double për numra me presje, char për një shkronjë, bool për true/false, dhe long long për numra shumë të mëdhenj. Tipi vendos sa memorie zë variabla.

C++ IDEs (Code::Blocks, Visual Studio)

IDE për C++

Për C++ përdoren shpesh Code::Blocks dhe Dev-C++ (sidomos në shkolla), Visual Studio në Windows, CLion ose VS Code me shtojca. Ato e kanë kompajlerin dhe debugger-in brenda, që ta ekzekutosh programin me një klik.

C++ standards (C++11, C++17, C++20)

Versionet e C++

C++ përditësohet çdo tre vjet me një version të ri. C++11 e ndryshoi gjuhën shumë (auto, lambda, smart pointers) dhe quhet fillimi i „C++ modern“; C++17 dhe C++20 shtuan edhe më shumë. Me -std=c++20 i thua kompajlerit cilin version të përdorë.

class & struct (C++)

Klasat dhe struct-et në C++

Në C++ i krijon tipet e tua me class ose struct. Janë pothuajse njësoj; i vetmi dallim është se te struct gjithçka është public si parazgjedhje, ndërsa te class private. Zakonisht struct përdoret për të dhëna të thjeshta.

CMake & Makefile

Kur projekti ka shumë skedarë, s'i kompajlon me dorë: Makefile-i ose CMake-u i shkruajnë një herë hapat e ndërtimit, dhe pastaj mjafton një komandë. CMake-u është standardi i sotëm për projektet C++ — si Maven-i për Java-n.

Competitive programming

Programimi garues

Programimi garues janë garat ku zgjidh probleme algoritmike sa më shpejt dhe me kod sa më efikas — si olimpiadat e informatikës, Codeforces ose ICPC. C++ është gjuha më e përdorur aty, falë shpejtësisë dhe STL-së.

Compiling & linking

Kompajlimi dhe lidhja

Një program C++ ndërtohet në dy hapa: kompajleri e përkthen çdo skedar .cpp në kod makine (skedar .o), pastaj linker-i i bashkon të gjithë në një program të ekzekutueshëm. Gabimi „undefined reference“ vjen nga linker-i: ke deklaruar një funksion, por s'e ke shkruar askund.

const in C++

const në C++

const do të thotë „kjo s'ndryshon“. Me const int MAX = 100; krijon një konstante, dhe me const std::string& emri një funksion e merr tekstin pa e kopjuar dhe pa e ndryshuar. constexpr shkon më larg: llogaritet që gjatë kompajlimit.

Constructor & destructor (C++)

Konstruktori dhe destruktori

Konstruktori ekzekutohet kur krijohet një objekt, dhe destruktori (~EmriKlases) kur objekti zhduket. Destruktori është vendi për të pastruar — p.sh. të mbyllësh një skedar ose të lirosh memorie.

Copy constructor & rule of three

Konstruktori i kopjimit

Konstruktori i kopjimit vendos çfarë ndodh kur krijon një objekt si kopje të një tjetri. Nëse klasa jote menaxhon memorie me pointer-ë, kopja e paracaktuar kopjon vetëm adresën — dhe dy objekte e fshijnë të njëjtën memorie. „Rregulli i treve“ thotë: po shkrove destruktor, shkruaj edhe kopjimin dhe caktimin.

cout & cin (iostream)

cout dhe cin

cout dhe cin janë mënyra si një program C++ flet me përdoruesin: cout << shfaq tekst në ekran, ndërsa cin >> lexon atë që shkruan përdoruesi. Të dyja vijnë nga libraria <iostream>.

enum class

enum class krijon një tip me një listë të fiksuar vlerash me emër — p.sh. Ngjyra::Kuqe. Ndryshe nga enum-i i vjetër, emrat s'përzihen me pjesën tjetër të kodit dhe s'kthehen vetë në numra, prandaj është më i sigurt.

Exceptions in C++ (throw, catch)

Përjashtimet në C++

Në C++ e hedh një gabim me throw dhe e kap me try/catch. Kështu gabimi mund të trajtohet në një vend tjetër, larg nga ku ndodhi. Libraria standarde ka gabime të gatshme si std::runtime_error.

File I/O (fstream)

Skedarët në C++

Me <fstream>, ifstream lexon nga skedarët dhe ofstream shkruan në to — me të njëjtat << dhe >> që i përdor me cout dhe cin. Skedari mbyllet vetë kur objekti del nga scope-i.

for loop (C++)

Cikli for në C++

Cikli for klasik në C++ ka tri pjesë në kllapa: ku fillon (int i = 0), deri kur vazhdon (i < 10) dhe si ndryshon pas çdo hapi (i++). Është cikli që përdoret më shumë në detyrat e shkollës.

Function declaration (prototype)

Deklarimi i funksionit

Në C++ një funksion duhet të jetë i njohur para se ta përdorësh. Prandaj shpesh shkruan vetëm „kokën“ e tij lart (prototipin) — emrin, parametrat dhe tipin e kthimit — dhe trupin e plotë më poshtë ose në një skedar tjetër.

g++, GCC & Clang

g++ (pjesë e GCC-së), Clang dhe MSVC i Microsoft-it janë kompajlerët më të njohur të C++. E kthejnë kodin tënd në program që ekzekutohet. Në Windows, MinGW të jep g++; shumë IDE e kanë të instaluar brenda.

Header files (.h / .hpp)

Skedarët header

Në C++ kodi zakonisht ndahet në dy skedarë: header-i (.h) që thotë çfarë ekziston — klasat dhe prototipet e funksioneve — dhe .cpp-ja që e ka kodin e plotë. #pragma once në krye të header-it e pengon të përfshihet dy herë.

Inheritance in C++ (: public)

Trashëgimia në C++

Në C++ një klasë trashëgon nga një tjetër me „: public Prindi“. Fëmija merr fushat dhe metodat e prindit dhe mund t'u shtojë të tijat. Ndryshe nga Java, C++ lejon edhe trashëgimi nga disa klasa njëkohësisht.

int main()

Funksioni main në C++

Çdo program C++ fillon te funksioni int main(). Kompjuteri e ekzekuton kodin brenda tij nga lart poshtë, dhe return 0; në fund i thotë sistemit që programi mbaroi pa probleme.

Iterators (C++)

Iteratorët në C++

Iteratorët janë si „gishta“ që tregojnë një element brenda një kontejneri. begin() tregon të parin, end() vendin pas të fundit. Algoritmet e STL-së punojnë me një çift iteratorësh, p.sh. sort(v.begin(), v.end()).

Lambda expressions (C++)

Shprehjet lambda në C++

Lambda-t në C++ janë funksione të shkurtra pa emër, të shkruara me [](parametrat) { trupi }. Kllapat katrore [] tregojnë cilat variabla nga jashtë mund t'i përdorë. Përdoren shumë me sort() dhe algoritme të tjera.

namespace & std::

Hapësira e emrave (namespace)

Një namespace është një „mbiemër“ për emrat në kod, që dy gjëra me të njëjtin emër të mos ngatërrohen. Gjithçka nga libraria standarde e C++ jeton te std, prandaj shkruan std::cout. Me using namespace std; s'ke pse e shkruan çdo herë — mirë për detyra, por shmange në projekte të mëdha.

new & delete

Me new kërkon memorie gjatë ekzekutimit (në heap), dhe me delete e kthen kur s'të duhet më. Po harrove delete, memoria s'lirohet kurrë (memory leak). Në C++ modern përdor më shpesh vector ose smart pointers, që e bëjnë këtë vetë.

nullptr

nullptr është vlera e një pointer-i që s'tregon askund. Nëse përpiqesh ta lexosh (*p) një pointer që është nullptr, programi rrëzohet — prandaj kontrollo gjithmonë para se ta përdorësh.

Operator overloading

Mbingarkimi i operatorëve

Operator overloading të lejon të vendosësh çfarë bëjnë +, ==, << e të tjerë për klasat e tua. P.sh. dy objekte Pike mund t'i mbledhësh me + si të ishin numra.

Preprocessor & macros (#define)

Paraprocesori dhe makrot

Paraprocesori e lexon kodin para kompajlerit dhe zbaton komandat me # — #include, #define, #ifdef. #define krijon makro që zëvendësohen si tekst. Në C++ modern preferohen const dhe funksionet, sepse makrot s'kontrollohen nga kompajleri.

public, private, protected (C++)

Specifikuesit e qasjes në C++

Në një klasë C++, public: tregon çfarë mund ta përdorë kushdo, private: çfarë sheh vetëm vetë klasa, dhe protected: çfarë shohin edhe klasat që e trashëgojnë. Kështu i mbron të dhënat nga ndryshimet e gabuara.

Pure virtual function (= 0)

Funksion thjesht virtual

Një funksion thjesht virtual (virtual ... = 0) s'ka trup — thjesht thotë „çdo klasë fëmijë duhet ta ketë këtë“. Klasa që ka të paktën një të tillë bëhet abstrakte: s'mund të krijosh objekte prej saj, vetëm prej fëmijëve.

RAII

RAII (Resource Acquisition Is Initialization) është ideja kryesore e C++: një burim (memorie, skedar, lidhje) e merr në konstruktor dhe e liron në destruktor. Kështu, kur objekti del nga scope-i, gjithçka pastrohet vetë — edhe nëse ndodh gabim.

Range-based for loop

Cikli for mbi koleksion

Cikli for i bazuar në koleksion (që nga C++11) kalon nëpër çdo element pa numërues: for (int n : notat). Me auto& mund t'i ndryshosh elementet direkt, dhe me const auto& i lexon pa i kopjuar.

References & pass by reference (&)

Referencat në C++

Një referencë (&) është një emër i dytë për të njëjtën variabël. Kur një funksion merr parametër me &, punon me origjinalin, jo me një kopje — kështu mund ta ndryshojë, dhe s'humbet kohë duke kopjuar objekte të mëdha.

Segmentation fault

Gabim segmentimi

Segmentation fault është kur programi përpiqet të prekë memorie që s'i takon — p.sh. përmes një pointer-i nullptr, ose duke dalë jashtë kufijve të një vargu. Sistemi e ndal menjëherë programin. Është gabimi më i zakonshëm i fillestarëve në C++.

sizeof

sizeof të tregon sa bajt zë një tip ose variabël në memorie — p.sh. sizeof(int) zakonisht është 4, sizeof(double) 8. Ndihmon të kuptosh sa memorie përdor programi.

Smart pointers (unique_ptr, shared_ptr)

Pointer-ët e zgjuar

Smart pointer-ët janë pointer-ë që e lirojnë vetë memorien kur s'duhet më — s'ke pse shkruan delete. unique_ptr ka vetëm një pronar; shared_ptr numëron sa e përdorin dhe e fshin kur largohet i fundit. Në C++ modern përdor këta në vend të new/delete.

Stack vs heap

Stack dhe heap

Programi ka dy zona kryesore memorieje. Stack-u është i shpejtë dhe i vogël: variablat lokale vendosen aty dhe zhduken vetë kur mbaron funksioni. Heap-i është i madh: aty kërkon memorie me new (ose vector) dhe ajo mbetet derisa ta lirosh.

static_cast

static_cast<tipi>(vlera) e kthen qartë një vlerë në një tip tjetër, p.sh. int në double, që pjesëtimi të japë presje. Është mënyra e sigurt dhe e lexueshme e C++ në vend të (double) të vjetër të C-së.

std::map

Map-i në C++

std::map ruan çifte çelës–vlerë, të renditura sipas çelësit — si fjalori i Python-it. E kërkon vlerën me map["çelësi"], dhe kur kalon nëpër to, dalin me radhë alfabetike.

std::pair

std::pair mban dy vlera bashkë, që mund të jenë të tipeve të ndryshme, dhe i merr me .first dhe .second. Përdoret shpesh për pikat (x, y) ose për çifte si emër–notë.

std::string

Teksti në C++ (string)

std::string është tipi i C++ për tekst. Mund t'i bashkosh me +, t'ua marrësh gjatësinë me .size(), dhe me getline() lexon një rresht të tërë nga përdoruesi (cin >> ndalet te hapësira e parë).

std::vector

Vektori në C++

vector-i është „lista“ e C++: një varg që rritet vetë kur shton elemente me push_back(). Di vetë madhësinë e vet (.size()) dhe e liron memorien vetë. Është kontejneri që do ta përdorësh më shpesh.

STL (Standard Template Library)

Libraria standarde e shablloneve

STL-ja është pjesa e librarisë standarde të C++ me kontejnerë të gatshëm (vector, map, set, queue, stack), algoritme (sort, find) dhe iteratorë. Me të s'ke pse i shkruan vetë strukturat bazë të të dhënave.

STL algorithms (sort, find)

Algoritmet e STL-së

Libraria <algorithm> ka funksione të gatshme për punët e zakonshme: sort() rendit, find() kërkon, reverse() kthen mbrapsht, max_element() gjen më të madhin. Janë të testuara dhe shumë të shpejta.

Templates

Shabllonet (templates)

Templates të lejojnë të shkruash një funksion ose klasë një herë, që punon me çdo tip — int, double, string. vector<int> dhe vector<string> janë i njëjti template me tipe të ndryshme. Janë si generics-at e Java-s.

Undefined behavior

Sjellje e papërcaktuar

Sjellja e papërcaktuar ndodh kur bën diçka që rregullat e C++ s'e lejojnë — p.sh. lexon jashtë një vargu ose përdor një variabël pa i dhënë vlerë. Programi mund të duket sikur punon, të japë rezultate të çuditshme ose të rrëzohet — dhe sot ndryshe nga nesër.

unordered_map & unordered_set

unordered_map dhe unordered_set përdorin tabela hash, prandaj kërkimi është shumë i shpejtë, por pa renditje. std::set mban vlera unike të renditura. Në garat e programimit, unordered_map shpesh e bën zgjidhjen mjaft të shpejtë.

Unreal Engine

Unreal Engine-i është një nga motorët më të fuqishëm për të bërë lojëra video dhe grafika 3D, dhe kodi i tij shkruhet në C++. Shumë lojëra të mëdha (dhe efekte filmash) janë bërë me të.

virtual functions & override

Funksionet virtuale

Në C++, që klasa fëmijë ta mbishkruajë një metodë dhe të thirret versioni i saj edhe përmes një pointer-i të prindit, metoda duhet të shënohet virtual te prindi. Fjala override te fëmija e kontrollon që e ke bërë saktë.