Sobes.tech
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-ով։