- Qaytarılan tipi, parametrləri və
returnolan funksiya yazmaq və onu çağırmaq - Funksiyaları yükləmək və susmaya görə arqumentlərdən istifadə etmək
- Qiymətə və istinada görə ötürmənin fərqini izah etmək
- Böyük obyektləri
constistinadla ötürmək
Təsəvvür et ki, oyununda iki personaj arasındakı məsafəni on yerdə hesablayırsan və hər dəfə eyni üç sətri köçürürsən. Düsturda səhv tapsan, onu on yerdə düzəltməli olacaqsan! Funksiyalar bu problemi həll edir: kodu bir dəfə yazır, ona ad verir və lazım olan qədər çağırırsan. Sən artıq bir funksiyanı tanıyırsan — main.
Funksiyanın təyini və çağırılması
C++ dilində funksiyanın təyini dörd hissədən ibarətdir: qaytarılan qiymətin tipi, ad, mötərizədə parametrlər və fiqurlu mötərizədə gövdə. return nəticəni çağırış yerinə qaytarır. Heç nə qaytarmayan funksiyanın tipi void-dir.
#include <iostream>
#include <string>
int square(int x) {
return x * x;
}
void greet(std::string name) {
std::cout << "Hello, " << name << "!\n";
}
int main() {
greet("Leyla");
int s = square(7);
std::cout << "7 squared is " << s << '\n';
std::cout << square(3) + square(4) << '\n';
return 0;
}Hello, Leyla! 7 squared is 49 25
Parametr funksiyanın təyinində yazılan dəyişəndir (int x). Arqument çağırış zamanı ona verilən konkret qiymətdir (square(7) çağırışında 7).
Kompilyator faylı yuxarıdan aşağı oxuyur, ona görə funksiya çağırılmazdan əvvəl ən azı elan olunmalıdır. Funksiyanı main-dən sonra yazmaq istəyirsənsə, yuxarıda onun prototipini — gövdəsiz başlığını qeyd et:
#include <iostream>
int cube(int x); // declaration (prototype)
int main() {
std::cout << cube(3) << '\n';
return 0;
}
int cube(int x) { // definition
return x * x * x;
}27
Funksiyaların yüklənməsi
C++ dilində eyni adlı bir neçə funksiya ola bilər, bir şərtlə ki, parametrlərinin sayı və ya tipləri fərqlənsin. Buna yüklənmə (overloading) deyilir. Kompilyator çağırışdakı arqumentlərə baxıb uyğun variantı özü seçir. Nümunədəki a > b ? a : b ifadəsi üçlü operatordur: «şərt doğrudursa a, əks halda b» deməkdir.
#include <iostream>
int maxOf(int a, int b) {
return a > b ? a : b;
}
double maxOf(double a, double b) {
return a > b ? a : b;
}
int maxOf(int a, int b, int c) {
return maxOf(maxOf(a, b), c);
}
int main() {
std::cout << maxOf(3, 8) << '\n';
std::cout << maxOf(2.5, 1.5) << '\n';
std::cout << maxOf(4, 9, 6) << '\n';
return 0;
}8 2.5 9
Susmaya görə arqumentlər
Parametrə susmaya görə qiymət vermək olar: çağırışda həmin arqument yazılmasa, bu qiymət götürülür. Qayda belədir: susmaya görə qiymətli parametrlər siyahının sonunda durmalıdır.
#include <iostream>
#include <string>
void printPrice(std::string item, int price, std::string currency = "AZN") {
std::cout << item << ": " << price << ' ' << currency << '\n';
}
int main() {
printPrice("Book", 12);
printPrice("Headphones", 40, "USD");
return 0;
}Book: 12 AZN Headphones: 40 USD
Qiymətə və istinada görə ötürmə
Susmaya görə C++ arqumentin surətini ötürür: funksiya parametri dəyişsə də, çağıran tərəfdəki dəyişən toxunulmaz qalır. Parametr tipindən sonra & yazsan, parametr istinada çevrilir — orijinal dəyişənin başqa adına. Onda funksiyanın etdiyi dəyişiklik orijinala da təsir edir.
#include <iostream>
void addBonusCopy(int points) {
points += 10;
}
void addBonus(int& points) {
points += 10;
}
int main() {
int score = 50;
addBonusCopy(score);
std::cout << "After copy: " << score << '\n';
addBonus(score);
std::cout << "After reference: " << score << '\n';
return 0;
}After copy: 50 After reference: 60
İstinadlar iki halda xüsusilə faydalıdır: funksiya bir neçə dəyişəni dəyişməlidirsə (məsələn, iki qiymətin yerini dəyişmək) və ya böyük obyekti köçürmədən oxumalıdırsa. İkinci halda const std::string& yazırıq: surət yaranmır, funksiya isə mətni dəyişə bilmir.
#include <iostream>
#include <string>
void swapValues(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
void printBanner(const std::string& text) {
std::cout << "*** " << text << " ***\n";
}
int main() {
int x = 3;
int y = 8;
swapValues(x, y);
std::cout << "x = " << x << ", y = " << y << '\n';
printBanner("Game over");
return 0;
}x = 8, y = 3 *** Game over ***
| Üsul | Yazılış | Orijinal dəyişirmi? | Nə vaxt işlətməli |
|---|---|---|---|
| qiymətə görə | int x | xeyr | kiçik tiplər: int, double, char |
| istinada görə | int& x | bəli | funksiya dəyişəni dəyişməlidirsə |
const istinada görə | const std::string& s | xeyr | yalnız oxunan böyük obyektlər |
Əsas fikirlər
- Funksiya
tip ad(parametrlər) { ... }şəklində təyin olunur;voidheç nə qaytarmır. - Funksiya çağırılmazdan əvvəl elan olunmalıdır — lazım olsa, prototip yaz.
- Yüklənmə: eyni adlı, amma parametrləri fərqli funksiyalar; uyğun variantı kompilyator seçir.
- Susmaya görə qiymətli parametrlər siyahının sonunda olur.
- Qiymətə görə ötürmə surət yaradır,
&orijinalla işləyir,const &isə surətsiz və təhlükəsiz oxumaq üçündür.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.