Inline funksiyalar Proqramın funksiyalar yıgımı şəklində realizasiyası proqram təminatının hazırlanmasi nöqtəyi nəzərindən əlverişlidir. Lakin proqramın yerinə yetirilməsi vaxtı funksiyalara müraciət əlavə itkilərə səbəb olur. Funksiyalara müraciət zamanı belə itkiləri azaltmaq üçün inline funksiyalardan istifadə etmək olar. İnline spesifikasiya funksiyasının başlığında nəticənin tipindən əvvəl yazılır. İnline spesifikasiyası kompilyatora funksiyanın kodunun sürətini proqramın uyğun yerində generasiya etməyə göstəriş verir. Belə olduüda bu funksiyaya müraciət əməliyyatı yerinə yetirilmir. Nəticədə funksiyaya hər bir müraciətdə funksiyanın yeganə surəti əvəzinə funksiyanın kodunun surətlər çoxluğu alınır.
İnline funksiyasında istənilən dəyişiklik bu funksiyanın bütün istifadəçilərinin yenidən kompilyasiya olunmasını tələb edir. İnline spesifikatorundan çox da böyük olmayan və tez-tez istifadə olunan funksiyalar üçün istifadə etmək əlverişlidir. İnline funksiyadan istifadə edilməsi nəticəsində proqramın yerinə yetirilmə vaxtı azalır, lakin onun həcmi artır. Aşağıdaki proqramda inline funksiyasından istifadə etməklə kubun həcmi hesablanır.
#include using namespace std;
inline double cube (const double S)
\\const double S-
\\olduqda funksiya
\\daxilində qiymətləri
\\dəyişmək olmaz
{return S*S*S;}
int main( ) {
cout<<”kubun tərəfini daxil edinI”;
double Side;
cin <cout<<”tərəfi” <>”olan kubun həcmi=”<<
cube(side)< return 0;
}
Nəticə:
Kubun tərəfini daxil edin: 3
tərəfi 3 olan kubun həcmi = 27.
Funksiyanın yenidən yüklənməsi mexanizmi poliformizm (bir interfeys, çoxlu metodlar) prinsipinə əsaslanır. C++ dilində iki və daha çox funksiyalar eyni ada malik ola bilərlər. Onlar bir-birindən tiplərinə və arqumentlərinin sayına görə fərqlənə bilərlər. Əgər iki və daha çox funksiyalar eyni bir ada malikdirsə, onda deyirlər ki, onlar yenidən yüklənmişdir. Yüklənmiş funksiyalar proqramın sadələşdirilməsinə imkan verir və bir-birinə yaxın olan əməliyyatların yerinə yetirilməsi üçün eyni bir ada müraciət edilməsini mümkün edir. Funksiyanın yüklənməsi zamanı bütün mümkün variantlar təyin edilməlidir. Funksiyaya müraciət zamanı kompilyator funksiyanın tipini və arqumentlərin sayını avtomatik olaraq götürür. Məlumdur ki, C dilində yerinə yetirdiyi əməliyyatlara görə bir-birinə yaxın olan və yalnız tiplərinə görə fərqlənən funksiyalar vardır. Məsələ, C dilinin kitabxanasında abs( ), labs( ), fabs( ) funnksiyaları vardır ki, onlar uyğun olaraq tam ədədlərin, uzun tam ədədlərin və sürüşkən nöqtəli ədədlərin mütləq qiymətlərini hesablayır. Ona görə də üç tip verilən üçün üç funksiya tələb olunur ki, bu isə proqram tərtibini bir qədər mürəkkəbləşdirir. Bütün hallarda tiplərinə görə fərqlənən ədədlərin mütləq qiymətləri qaytarılır. C++ dilində bu halı aradan qaldırmaq üçün funksiyaların yenidən yüklənməsi üsulundan istifadə etməklə hər üç tip üçün funksiyalara bir ad vermək olar. Aşağıdaki misalda funksiyaların yüklənməsi nümayiş etdirilmişdir.
#include using namespace std;
//üç üsulla abs( )-funksiyasının yüklənməsi
int abs(int n);
long abs(long n);
double abs(double n);
int main ( )
{
cout <<”-10-un mütləq qiyməti:”<cout <<”-10L-ın mütləq qiyməti:” << abs(-10L)<<”\n”;
cout <<”-10.01-in mütləq qiyməti:” <return 0;
}
//tam ədədlər üçün abs( )
int abs(int n){
cout <<”tam ədəd üçün abs( )\n”;
return n<0?-n:n;
}
//uzun tam ədəd üçün abs( )
long abs(long n){
cout <<”uzun tam ədəd üçün abs( )\n”;
return n<0?-n; n;}
//ikiqat dəqiqlə olan həqiqi ədədi üçün abs( )
double abs(double n)
{
cout <<”həqiqi ədəd üçün abs( ) \ n”;
return n<0?-n: n;
}
Göründüyü kimi, proqramda müxtəlif tipli verilənə malik olan abs( )-adlı üç funksiya təyin edilmişdir. main funksiyasının daxilində abs( )–funksiyasına müxtəlif tipli üç arqumentlə müraciət edilir. Kompilyator düzgün varianta avtomatik olaraq müraciət edir. Proqramın işləməsi nəticəsində ekrana aşağıdakılar veriləcəkdir:
tam ədəd üçün abs( )
-10-un mütləq qiyməti: 10
uzun tam ədədi üçün abs( )
-10L-in mütləq qiyməti: 10
həqiqi ədəd üçün abs( )
-10.01-in mütləq qiyməti: 10.01
Bu sadə proqramda funksiyaların yüklənməsinin əhəmiyyətliliyi nümayiş etdirilmişdir. Bu halda abs( ), labs( ),fabs( )- kimi üç adın işlənməsi aradan qaldırıldı və ancaq bir addan-abs( )-adından istifadə edildi. Funksiyaya müraciət zamanı düzgün variantın seçilməsi məsələsini kompilyator həll edir.
60.Yüklənən funksiysları bir-birindən fərqləndirən əlamətlər
Baxdığımız misalda yüklənən funksiyalar bir birindən tiplərinə görə fərqlənirdilər. Yüklənən funksiyalar arqumentlərinin sayına görə də fərqlənə bilərlər. Aşağıdaki misala baxaq:
#include
using namespace std;
void f1(int a);
int f1(int a; int b);
int main( )
{
f1(10);
f1(10, 20);
return 0;
}
void f1(int a)
{
cout <<”f1(int a)-ya müraciət\n”;
}
void f1(int a, int b)
{
cout <<”f1(int a, int b)-yə müraciət \n”;
}
Funksiyanın qaytardığı qiymətin tipi onun yenidən yüklənməsi üçün kafi deyildir. Əgər iki funksiya qaytardığı qiymətlərin tipinə görə fərqlənirlərsə, onda kompilyator funksiyalara müraciət zamanı hansının seçilməsi məsələsini həll edə bilmir.
Məsələ, //Aşağıdakilar düz deyil və kompilyasiya olunmayacaq
int f1(int a);
double f1(int b);
.
.
.
f1(10); //Kompilyator hansı funksiyanı seçəcək?
Kompilyatorda elə bir vasitə yoxdur ki, f1( )-müraciəti zamanı hansı variantın seçilməsini müəyyən etsin. Proqramın düzgün işləməsi üçün arqumentlərin tipi fərqli olmalıdır.