Sobes.tech
Middle

Jakie są różnice między typem wartości a typem referencyjnym w językach programowania?

sobes.tech AI

Odpowiedź od AI

Typy wartości (np. struct, enum, podstawowe typy liczbowe) przechowują swoją wartość bezpośrednio. Podczas przypisania lub przekazania do funkcji tworzona jest kopia wartości.
Typy referencyjne (np. class, function, closure) przechowują odwołanie do miejsca w pamięci, gdzie znajduje się sama wartość. Podczas przypisania lub przekazania tworzona jest kopia odwołania, wskazująca na ten sam obiekt w pamięci.

Główne różnice:

Cecha Typ Wartości Typ Referencyjny
Sposób przechowywania Wartość jest przechowywana bezpośrednio w zmiennej Zmienna przechowuje odwołanie do wartości
Przypisanie Kopiuje wartość Kopiuje odwołanie (wskazuje na ten sam obiekt)
Modyfikacja Modyfikacja kopii nie wpływa na oryginał Modyfikacja przez odwołanie wpływa na oryginał
Miejsce w pamięci Zazwyczaj na stosie (dla zmiennych lokalnych) Zazwyczaj na stercie
Zarządzanie pamięcią Automatyczne (po wyjściu z zakresu) ARC (Automatyczne Liczenie Odwołań)

Przykład w Swift:

// typ wartości
struct PointStruct {
    var x: Int
    var y: Int
}

var point1 = PointStruct(x: 1, y: 2)
var point2 = point1 // kopiuje wartość
point2.x = 10

print(point1.x) // wyświetli 1
print(point2.x) // wyświetli 10

// typ referencyjny
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 // kopiuje odwołanie
point4.x = 10

print(point3.x) // wyświetli 10 (obiekt zmienił się przez odwołanie)
print(point4.x) // wyświetli 10