Junior
Ի՞նչ են հղման տվյալների տեսակները։
sobes.tech AI
Պատասխան AI-ից
Տիպային տվյալների հղումային տեսակները չեն պահում հենց արժեքը, այլ հղում (հիշողության հասցե) այն տեղը, որտեղ այդ արժեքը գտնվում է:
Հատկություններ՝
- Հղումային տիպի փոփոխականները կարող են պարունակել
null: - Երբ մի հղումային տիպի փոփոխականի արժեքը փոխանցվում է մյուսին, ոչ թե ինքն արժեքը, այլ հղումը է պատճենվում։ Երկուսն էլ սկսում են ցույց տալ նույն տեղը հիշողության մեջ։
- Փոփոխությունները, որոնք կատարվում են մեկ հղումով, տեսանելի կլինեն մյուսով, եթե նրանք ցույց են տալիս նույն օբյեկտին։
- Հիշողությունը հղումային տիպերի օբյեկտների համար կառավարում է գարբեջ հավաքողը։
Հղումային տիպերի օրինակներ՝
- Տողեր (
String) - Մասիվներ
- Օբյեկտներ օգտագործողի դասերից
- Դելեգատներ (միայն որոշ լեզուներում)
Տարբերություն արժեքային տիպերից՝
| Հատկություն | Արժեքային տիպեր | Հղումային տիպեր |
|---|---|---|
| Պահպանում | Իր արժեքը | Հղում դեպի արժեքը |
| Կոպիավորում | Կոպիրվում է հենց արժեքը | Կոպիրվում է հղումը |
| Փոփոխություն | Փոփոխությունները կոպիումում չեն ազդում օригинալին | Փոփոխությունները մեկ հղումով տեսանելի կլինեն մյուսով, եթե ցույց են տալիս նույն օբյեկտին |
| Հիշողություն | Կառավարում է ստեկը (stack) | Կառավարում է հողը, մաքրվում գարբեջ հավաքողը |
| Օրինակներ | int, float, bool, struct (միայն որոշ լեզուներում) |
String, Array, Object |
// Օրինակ C#-ում
string s1 = "Hello"; // s1 ցույց է տալիս "Hello" տողին
string s2 = s1; // s2 ցույց է տալիս նույն հղմանը, ինչ s1
// Փոփոխության դեպքում, մյուս հղումով դա չի երևա,
// քանի որ տողերը C#-ում անփոփոխ են։
// Փոփոխության ժամանակ ստեղծվում է նոր տող և հղումը փոխվում է։
s1 = "World";
Console.WriteLine(s2); // Արտածում է "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 ցույց է տալիս զանգվածին {1, 2, 3}
int[] arr2 = arr1; // arr2 ցույց է տալիս նույն հղմանը
arr2[0] = 10; // Փոփոխություն arr2-ով
Console.WriteLine(arr1[0]); // Արտածում է 10, փոփոխությունը տեսանելի է arr1-ով։
// Օրինակ Java-ում
String s1 = "Hello"; // s1 ցույց է տալիս "Hello" տողին
String s2 = s1; // s2 ցույց է տալիս նույն հղմանը, ինչ s1
// Տողերը Java-ում անփոփոխ են։
// Փոփոխության ժամանակ ստեղծվում է նոր տող և հղումը փոխվում։
s1 = "World";
System.out.println(s2); // Արտածում է "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 ցույց է տալիս զանգվածին {1, 2, 3}
int[] arr2 = arr1; // arr2 ցույց է տալիս նույն հղմանը
arr2[0] = 10; // Փոփոխություն arr2-ով
System.out.println(arr1[0]); // Արտածում է 10, փոփոխությունը տեսանելի է arr1-ով։