Məzmuna keç
Educora
Orta18 dəq4 / 10

Funksiyalar

Öz funksiyalarını yaz: qaytarılan qiymət, parametrlər, prototiplər, yüklənmə, susmaya görə arqumentlər, qiymətə və istinada görə ötürmə.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Qaytarılan tipi, parametrləri və return olan 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 const istinadla ö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.

C++
#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;
}
Gözlənilən nəticə
Hello, Leyla!
7 squared is 49
25
Tərif
Parametr və arqument

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:

C++
#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;
}
Gözlənilən nəticə
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.

C++
#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;
}
Gözlənilən nəticə
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.

C++
#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;
}
Gözlənilən nəticə
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.

C++
#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;
}
Gözlənilən nəticə
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.

C++
#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;
}
Gözlənilən nəticə
x = 8, y = 3
*** Game over ***
ÜsulYazılışOrijinal dəyişirmi?Nə vaxt işlətməli
qiymətə görəint xxeyrkiçik tiplər: int, double, char
istinada görəint& xbəlifunksiya dəyişəni dəyişməlidirsə
const istinada görəconst std::string& sxeyryalnız oxunan böyük obyektlər

Əsas fikirlər

  • Funksiya tip ad(parametrlər) { ... } şəklində təyin olunur; void heç 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.

1 / 10
Heç nə qaytarmayan funksiyanın tipi hansıdır?