Sobes.tech
Middle

Aké sú rozdiely medzi typom hodnoty a referenčným typom v programovacích jazykoch?

sobes.tech AI

Odpoveď od AI

Typy hodnôt (napríklad struct, enum, základné číselné typy) ukladajú svoju hodnotu priamo. Pri priradení alebo odovzdaní do funkcie sa vytvorí kópia hodnoty.
Typy odkazov (napríklad class, function, closure) ukladajú odkaz na miesto v pamäti, kde sa nachádza samotná hodnota. Pri priradení alebo odovzdaní sa vytvorí kópia odkazu, ktorý odkazuje na rovnakú hodnotu v pamäti.

Hlavné rozdiely:

Charakteristika Typ hodnoty Typ odkazu
Spôsob ukladania Hodnota je uložená priamo v premennej Premenná ukladá odkaz na hodnotu
Priradenie Kopíruje sa hodnota Kopíruje sa odkaz (ukazuje na ten istý objekt)
Zmena Zmena kópie neovplyvňuje originál Zmena cez odkaz ovplyvňuje originál
Miesto v pamäti Zvyčajne na zásobníku (pre lokálne premenne) Zvyčajne na halde
Správa pamäti Automatická (pri opustení rozsahu) ARC (Automatické počítanie odkazov)

Príklad v Swift:

// typ hodnoty
struct PointStruct {
    var x: Int
    var y: Int
}

var point1 = PointStruct(x: 1, y: 2)
var point2 = point1 // kopíruje hodnotu
point2.x = 10

print(point1.x) // vypíše 1
print(point2.x) // vypíše 10

// typ odkazu
class PointClass {
    var x: Int
    var y: Int

    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

var point3 = PointClass(x: 1, y: 2)
var point4 = point3 // kopíruje odkaz
point4.x = 10

print(point3.x) // vypíše 10 (objekt sa zmenil cez odkaz)
print(point4.x) // vypíše 10