Junior
Mis on viidetüübid?
sobes.tech AI
Vastus AI-lt
Viitamissüsteemi andmetüübid ei hoia väärtust ise, vaid viidet (aadressi mälus) kohta, kus see väärtus asub.
Omadused:
- Viidetüüpi muutujad võivad sisaldada
null. - Kui ühe viidetüüpi muutuja väärtus antakse teisele, kopeeritakse mitte väärtus ise, vaid viide. Mõlemad muutujad hakkavad osutama samale mälukoha aadressile.
- Muudatused, mis tehakse ühe viite kaudu, on nähtavad teise kaudu, kui mõlemad osutavad samale objektile.
- Mäluhaldus nende viidetüüpi objektide jaoks toimub prügikoristaja (garbage collector) poolt.
Näited viidetüüpidest:
- Stringid (
String) - Massiivid
- Kasutaja klasside objektid
- Delegaadid (mõnedes keeltes)
Erinevus väärtustüüpidest:
| Omadus | Väärtustüübid | Viidetüübid |
|---|---|---|
| Salvestus | Oma väärtus | Viide väärtusele |
| Kopeerimine | Kopeeritakse väärtus ise | Kopeeritakse viide |
| Muutmine | Muudatused koopias ei mõjuta algset | Muudatused ühe viite kaudu on nähtavad teise kaudu, kui viitavad samale objektile |
| Mäluhaldus | Hallatakse virna (stack) kaudu | Hallatakse virna (heap), puhastatakse prügikoristaja poolt |
| Näited | int, float, bool, struct (mõnedes keeltes) |
String, Array, Object |
// Näide C#-s
string s1 = "Hello"; // s1 viitab stringile "Hello"
string s2 = s1; // s2 viitab samale viitele nagu s1
// Muutused ei ole nähtavad teise viite kaudu,
// sest stringid on C#-s immutabilised.
// Muutuse korral luuakse uus string ja viit ümber suunatakse.
s1 = "World";
Console.WriteLine(s2); // Kuvab "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 viitab massiivile {1, 2, 3}
int[] arr2 = arr1; // arr2 viitab samale viitele
arr2[0] = 10; // Muudatus arr2 kaudu
Console.WriteLine(arr1[0]); // Kuvab 10, muudatus on nähtav ka arr1 kaudu
// Näide Java-s
String s1 = "Hello"; // s1 viitab stringile "Hello"
String s2 = s1; // s2 viitab samale viitele nagu s1
// Stringid Java-s on immutabilised.
// Muutuse korral luuakse uus string ja viit ümber suunatakse.
s1 = "World";
System.out.println(s2); // Kuvab "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 viitab massiivile {1, 2, 3}
int[] arr2 = arr1; // arr2 viitab samale viitele
arr2[0] = 10; // Muudatus arr2 kaudu
System.out.println(arr1[0]); // Kuvab 10, muudatus on nähtav ka arr1 kaudu