3. stl tarkibi Sinf-konteynerlar


Funksiya shabloniga misol



Yüklə 111,06 Kb.
səhifə2/7
tarix22.12.2023
ölçüsü111,06 Kb.
#189293
1   2   3   4   5   6   7
4-ma\'ruza

Funksiya shabloniga misol
#include
using namespace std;
// Funksiya shabloni e’lon qilinishi...
template void swapargs(X &a, X &b)
{
X temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int i=10, j=20;
double x=10.1, y=23.3;
char a='x', b='z';
cout << "Original i, j: " << i << ' ' << j << '\n';
cout << "Original x, y: " << x << ' ' << y << '\n';
cout << "Original a, b: " << a << ' ' << b << '\n';
swapargs(i, j); // swap funksiyasi butun toifa uchun (int)
swapargs(x, y); // swap funksiyasi haqiqiy toifa uchun (float)
swapargs(a, b); // swap funksiyasi simvol toifa uchun (char)
cout << "Swapped i, j: " << i << ' ' << j << '\n';
cout << "Swapped x, y: " << x << ' ' << y << '\n';
cout << "Swapped a, b: " << a << ' ' << b << '\n';

return 0;
}
Dastur izohi:
Umumiy funksiyaning boshqacha ko’rinishi
Quyidagi misolda swapargs( ) funksiyasi boshqacharoq ko’rinishda e’lon qilingan. Ya’ni shablon birinchi satrda funksiya esa alohida satrda joylashgan.
template
void swapargs(X &a, X &b)
{
X temp;
temp = a;
a = b;
b = temp;
}

Lekin bu ko’rinishda birinchi va ikkinchi satr o’rniga bironta kod yozilsa xatolik beradi


template
int c // ERROR
void swapargs(X &a, X &b)
{
X temp;
temp = a;
a = b;
b = temp;
}
Funksiya shablonini override (qayta yozish) qilish.
template void swapargs(X &a, X &b)
{
X temp;
temp = a;
a = b;
b = temp;
cout << "swapargs funksiya shabloni chaqirildi.\n";
}
// Bunda swapargs() funksiyasi faqatgina int tipi uchun ishlaydi.
void swapargs(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
cout << " int tipi uchun maxsus swapargs funksiyasi.\n";
}
int main()
{
int i=10, j=20;
double x=10.1, y=23.3;
char a='x', b='z';
cout << "Original i, j: " << i << ' ' << j << '\n';
cout << "Original x, y: " << x << ' ' << y << '\n';
cout << "Original a, b: " << a << ' ' << b << '\n';
swapargs(i, j); // calls explicitly overloaded swapargs()
swapargs(x, y); // calls generic swapargs()
swapargs(a, b); // calls generic swapargs()
cout << "Swapped i, j: " << i << ' ' << j << '\n';
cout << "Swapped x, y: " << x << ' ' << y << '\n';
cout << "Swapped a, b: " << a << ' ' << b << '\n';
return 0;
}

Dastur natijasi:



Original i, j: 10 20
Original x, y: 10.1 23.3
Original a, b: x z
int tipi uchun maxsus swapargs funksiyasi.
swapargs funksiya shabloni chaqirildi.
swapargs funksiya shabloni chaqirildi.
Swapped i, j: 20 10
Swapped x, y: 23.3 10.1
Swapped a, b: z x



Funksiya shablonini Override qilish yangi usuli
template<> void swapargs(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
cout << " int tipi uchun maxsus swapargs funksiyasi.\n";
}
Funksiya shablonini overload qilish.
// Oddiy funksiyalardek, funksiya shablonini ham overload qilish mumkin.
#include
using namespace std;
// f() funksiya shablonining birinchi turi.
template void f(X a)
{
cout << "Inside f(X a)\n";
}
// f() funksiya shablonining ikkinchi turi.
template void f(X a, Y b)
{
cout << "Inside f(X a, Y b)\n";
}
int main()
{
f(10); // calls f(X)
f(10, 20); // calls f(X, Y)
return 0;
}
Funksiya shablonining kamchiligi

  • Umumiy funksiyalar funksiya overloadining o’rnini bosishi mumkin.

  • Lekin bu yerda bitta kamchilik mavjud.

  • Biz oddiy funksiyani overload qilganimizda, har xil ma’lumotlar tipi uchun funksiya tanasini har xil qilib yozishimiz mumkin.

  • Lekin umumiy funksiyada har xil tip qabul qila olgani bilan funksiya tanasi har doim bir xil bo’ladi, chunki bitta funksiyaga murojaat bo’ladi.

  • Faqatgina ma’lumotlar tipi har xil bo’la oladi.

Umumiy sinflar (sinf shabloni)
Sinf shablonini e’lon qilishning umumiy formasi:
template TOIFA> class sinf_nomi{
...
}
Yoki quyidagi ko’rinishda e’lon qilish mumkin
template TOIFA>
class sinf_nomi {
...
}
Sinf shablonini ishlatish
sinf_nomi obyekt;


Sinf shabloni uchun oddiy misol.
#include
using namespace std;
template
class mypair {
T a, b;
public:
mypair (T first, T second)
{a=first; b=second;}
T getmax ();
};
template
T mypair::getmax (){
T retval;
retval = a>b? a : b;
return retval;
}
int main () {
mypair myobject (100, 75);
cout << myobject.getmax();
return 0;
}



Sinf shablonida ikki xil toifadan foydalanish
#include
using namespace std;
template class myclass {
Type1 i;
Type2 j;
public:
myclass(Type1 a, Type2 b) { i = a; j = b; }
void show() { cout << i << ' ' << j << '\n'; }
};
int main()
{
myclass ob1(10, 0.23);
myclass ob2('X', "Templates add power.");
ob1.show(); // show int, double
ob2.show(); // show char, char *
return 0;
}
Dastur natijasi:

10 0.23
X Templates add power.

Maxsuslashtirilgan sinf shabloni
template<> konstruktori maxsusashtirilgan sinf shabloni uchun ishlatiladi
template class myclass {
T x;
public:
myclass(T a) {
cout << "Inside generic myclass\n";
x = a;
}
T getx() { return x; }
};
// int toifasi uchun maxsuslashtirilgan sinf shabloni.
template <> class myclass {
int x;
public:
myclass(int a) {
cout << "Inside myclass specialization\n";
x = a * a;
}
int getx() { return x; }
};


Shablonning asosiy xususiyatlari

  • reusable kod yozish imkonini beradi.

  • Shablonlar yordamida framework lar yaratish mumkin

  • Dastur kodi egiluvchanlik xususiyatiga ega bo’ladi.

  • Turli xil tipdagi ma’lumotlar ustida ishlash uchun kod yozishda vaqtni tejash

STL komponentalari. C++ dagi STL lar (Standard Shablon Kutubxonalar), nomidan ko’rinib turibdiki, shablonlar yordamida yaratilgan.
STL tarkibi
Biblioteka yadrosi uchta elementdan iborat: konteynerlar, algoritmlar va iteratorlar.

  • Konteynerlar (containers) – bu boshqa elementlarni saqlovchi ob’ektlar. Masalan, vektor, chiziqli ro‘yxat, to‘plam.


  • Yüklə 111,06 Kb.

    Dostları ilə paylaş:
1   2   3   4   5   6   7




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin