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