Добавил:
bekan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:2-semestr / 2-lekciya_jif
.pdf
2-lekciya. Shablonlar menen islew. Funkciya shablon(template)ların
jaratıw usılları hám olarǵa baylanıslı máseleler sheshiw.
Jobası:
1. Shablonlar (Templates) túsinigi hám "Ulıwmalasqan
programmalastırıw" (Generic Programming).
2. Funkciya shablonların jaratıw hám qollanıw.
3. Klass shablonları hám olardıń áhmiyeti.
4. Shablonlardıń arnawlı jaǵdayları (Specialization) hám
artıqmashılıqları/kemshilikleri.
Shablonlar hám Ulıwmalasqan programmalastırıw
C++ tiliniń eń kúshli hám ózine tán ayrıqshalıqlarınıń biri – bul
"Shablonlar" (Templates). Shablonlar bizge kodtı maǵlıwmatlar tipine (int,
double, string) ǵárezsiz etip jazıwǵa imkaniyat beredi. Bul programmalastırıw
usılı "Ulıwmalasqan programmalastırıw" (Generic Programming) dep ataladı.
Ádette, biz funkciya jazǵanda parametrlerdiń tipin anıq kórsetiwimiz kerek
(mısalı, int a, int b). Biraq, eger bizge eki sandı qosatuǵın funkciya kerek bolsa,
biz int ushın bir funkciya, double ushın ekinshi, float ushın úshinshi funkciya
jazıwǵa májbúr bolamız. Logika birdey (a + b), biraq tipler hár qıylı bolǵanı
ushın kodtı qaytalawǵa (Code Duplication) tuwrı keledi. Shablonlar bul
mashqalanı sheshedi. Biz funkciya yamasa klastıń "qálibin" (shablonın) jazamız
hám tip ornına "T" (yamasa basqa atama) degen belgisiz tipti qollanamız.
Kompilyator programma kompilyaciya bolıp atırǵan waqıtta, biz qaysı tip penen
shaqırsaq, sol tip ushın sáykes keletuǵın funkciyanı avtomat túrde jaratıp
(generate) beredi. Bul process "Shablonnıń instanciyası" (Template
Instantiation) dep ataladı. Nátiyjede, biz bir ǵana kod jazamız, al kompilyator
biz ushın onlaǵan versiyaların jaratadı.
Ulıwmalasqan programmalastırıw STL (Standard Template Library)
kitapxanasınıń tiykarın quraydı. `vector`, `list`, `sort`, `max` sıyaqlı barlıq ataqlı
konteynerler hám algoritmler shablonlar arqalı jazılǵan. Sol sebepli
`vector<int>` yamasa `vector<string>` dep qálegen tiptegi massivti jarata
alamız. Shablonlar C++ tili ushın "polimorfizmniń" statikalıq (compile-time)
kórinisi bolıp tabıladı. Virtual funkciyalar (dinamikalıq polimorfizm)
programma islep turǵanda qaysı metodtı shaqırıwdı sheshse, shablonlar
kompilyaciya waqtında sheshedi. Bul shablonlardıń júdá tez islewin (overhead
joq) támiyinleydi.

Shablonlardıń sintaksisi `template <typename T>` yamasa `template
<class T>` gilt sózleri menen baslanadı. `typename` hám `class` bul jerde birdey
mánisti ańlatadı (tiykarınan `typename` qollanıw usınıs etiledi). `T` – bul
shablon parametri, ol qálegen tip (int, double, Student klassı) bolıwı múmkin.
Biz bir emes, bir neshe shablon parametrin de qollana alamız (`template
<typename T1, typename T2>`). Bul bizge júdá iykemli hám universal kod
jazıwǵa jol ashadı.
Funkciya shablonların jaratıw
Funkciya shablonı – bul hár qıylı tipler menen isley alatuǵın funkciya
formulası. Eń ápiwayı mısal – eki mánistiń eń úlkenin (maksimumın) tabıw.
#include <iostream>
using namespace std;
// Funkciya shablonı
template <typename T>
T myMax(T a, T b) {
return (a > b) ? a : b;
}
int main() {
cout << myMax(10, 20) << endl; // int ushın
cout << myMax(5.5, 2.3) << endl; // double ushın
cout << myMax('A', 'Z') << endl; // char ushın
return 0;
}
Bul jerde `myMax` funkciyası shaqırılǵanda, kompilyator `a` hám `b` nıń
tipine qaraydı. Eger `10` hám `20` berilse, `T` nı `int` dep esaplaydı hám `int
myMax(int, int)` funkciyasın jaratadı.
Funkciya shablonlarında "tipti dedukciyalaw" (Type Deduction) procesi
júredi. Yaǵnıy, biz kóbinese `myMax<int>(10, 20)` dep jazıwımız shárt emes,
kompilyator tipti argumentlerden ózi anıqlaydı. Biraq, eger biz `myMax(10,

2.5)` dep shaqırsaq (biri `int`, biri `double`), kompilyator qáte shıǵaradı, sebebi
`T` bir waqıtta hám `int`, hám `double` bola almaydı. Bunday jaǵdayda biz tipti
anıq kórsetiwimiz kerek: `myMax<double>(10, 2.5)` (bunda 10 avtomat 10.0 ge
aylanadı) yamasa eki túrli tip qabıllaytuǵın shablon jazıwımız kerek.
Eki túrli tip qabıllaytuǵın shablon:
template <typename T1, typename T2>
void printValues(T1 a, T2 b) {
cout << a << " hám " << b << endl;
}
int main() {
printValues(10, "Sálem"); // int hám const char*
return 0;
}
Bul jerde `T1` - `int`, `T2` - `string` (yamasa char*) boladı. Shablonlı
funkciyalar ápiwayı funkciyalar sıyaqlı "júkleniwi" (overload) múmkin. Yaǵnıy,
shablonlı `myMax` penen birge, ápiwayı `int myMax(int, int)` te bolıwı
múmkin. Kompilyator sáykeslikke qaray eń qolaylısın tańlaydı.
Klass shablonları
Shablonlar tek funkciyalar ushın emes, klasslar ushın da qollanıladı. Klass
shablonları kóbinese "Konteynerlerdi" (massiv, stek, gezek) jaratıw ushın kerek.
Mısalı, biz `int` saqlaytuǵın `IntStack` emes, al qálegen tipti saqlaytuǵın
`Stack<T>` jaratqımız keledi.
template <typename T>
class Stack {
private:
T arr[100];
int top;
public:
Stack() : top(-1) {}
void push(T val) { arr[++top] = val; }

T pop() { return arr[top--]; }
};
int main() {
Stack<int> intStack; // int saqlaytuǵın stek
intStack.push(5);
Stack<string> strStack; // string saqlaytuǵın stek
strStack.push("Hello");
return 0;
}
Klass shablonlarında tipti dedukciyalaw (C++17 ge shekem) islemeydi,
sonıń ushın biz `Stack<int>` dep `<>` ishinde tipti anıq jazıwımız shárt. Klass
shablonınıń metodların klastıń sırtında anıqlamaqshı bolsaq, sintaksis sál
quramalılasadı: `template <typename T> void Stack<T>::push(T val) { ... }`.
Shablonlarda "default parametrler" de bolıwı múmkin. Mısalı, `template
<typename T = int> class MyClass`. Eger paydalanıwshı tip kórsetpese
(`MyClass obj;`), avtomat túrde `int` qollanıladı. Sonday-aq, shablon parametri
retinde tek tipler emes, al "mánisler" (Non-type template parameters) de
qollanılıwı múmkin. Mısalı, `std::array<int, 5>` tegi `5` – bul tip emes, bul san.
template <typename T, int Size>
class StaticArray {
T arr[Size]; // Size - kompilyaciya waqtındaǵı konstanta
};
Bul bizge dinamikalıq yadtı (new/delete) qollanbay, statikalıq
massivlerdiń ólshemin shablon arqalı basqarıwǵa imkaniyat beredi.
Shablonnıń arnawlı jaǵdayları (Specialization)
Geyde ulıwma shablon barlıq tipler ushın durıs islemewi múmkin. Mısalı,
`myMax` funkciyası `char*` (C stilinegi qatarlar) ushın nadurıs isleydi, sebebi ol
qatarlardıń mánisin emes, al olardıń yadtaǵı adreslerin salıstıradı. Bunday

jaǵdayda biz "Shablonnıń arnawlı jaǵdayın" (Template Specialization)
jazıwımız kerek. Bul – anıq bir tip ushın jazılǵan bólek kod.
// Ulıwma shablon
template <typename T>
T myMax(T a, T b) {
return (a > b) ? a : b;
}
// char* ushın arnawlı jaǵday (Specialization)
template <>
const char* myMax<const char*>(const char* a, const char* b) {
return (strcmp(a, b) > 0) ? a : b; // strcmp arqalı salıstırıw
}
Endi `myMax("Alma", "Anar")` shaqırılǵanda, ulıwma shablon emes, al
arnawlı jazılǵan versiya isleydi. Klass shablonların da tolıq yamasa bólek
(partial) specializaciyalawǵa boladı. Mısalı, `vector<bool>` – bul `vector`
klassınıń arnawlı jaǵdayı bolıp, ol bool mánislerin 1 bayt emes, al 1 bit etip
saqlaydı (yadtı únemlew ushın).
Shablonlardıń tiykarǵı artıqmashılıǵı – kodtıń qaytalanbawı hám tip
qáwipsizligi. Kemshiligi – "Kodtıń isiwi" (Code Bloat). Hárbir tip ushın (`int`,
`double`, `float`) kompilyator jańa funkciya kodın jaratadı, bul orınlanıwshı
fayldıń (.exe) kólemin úlkeytiwi múmkin. Sonday-aq, shablonlarda qáte shıqsa,
kompilyator júdá uzın hám túsiniksiz qáte xabarların (error messages) shıǵaradı.
Degen menen, zamanagóy C++ te shablonlar (Concepts, Auto) júdá qolaylı
bolıp barmaqta.
BAQLAW SORAWLARÍ:
1. "Ulıwmalasqan programmalastırıw" (Generic Programming) degen ne
hám ol ne ushın kerek?
2. `typename` hám `class` gilt sózleriniń shablon parametrindegi
ayırmashılıǵı bar ma?

3. Funkciya shablonlarında "tipti dedukciyalaw" (Type Deduction) qalay
isleydi?
4. Klass shablonın (mısalı, `Stack<T>`) qollanǵanda `<int>` dep jazıw ne
ushın kerek?
5. Shablonnıń arnawlı jaǵdayı (Specialization) qanday jaǵdaylarda
qollanıladı?
Соседние файлы в папке 2-semestr
