C ++ структурные массивы - PullRequest
       6

C ++ структурные массивы

0 голосов
/ 03 сентября 2018

Мне недавно пришлось использовать массив структур для студентов (структура имела gpa, возраст, имя, уровень обучения). Первым делом я создал массив следующим образом:

struct Student 
{
    //struct info 
} 


int main()
{
    Student s1, s2, s3, s4, s5;
    Student sArr[5] = {s1, s2, s3, s4, s5};
}

Я начал использовать циклы для заполнения информации. Однако когда я вышел на печать, я использовал конкретное имя структуры

cout << s1.age;

и получил абсурдное число. Затем я избавился от s1 до s5 и просто распечатал массив, как это

cout << sArr[0].age;

Я предполагал, что в массиве будут храниться определенные структуры, подобные тем, которые я объявил. Однако я узнал, что s1.age и sArr [0] .age - это не одно и то же. Почему это? Я думал, что массив хранит структуру s1, а sArr [0] является ссылкой на структуру s1.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вы получаете абсурдный ответ, потому что вы присваиваете переменную в элемент массива, который на самом деле является другой переменной, так что это похоже на копирование атрибутов одной переменной в другую. Это вовсе не означает, что обращение к одной переменной приведет нас к изменить в другую переменную.

int a=10,c=12;
int b[2]={a,b};

В этом случае это не означает, что изменение в переменной a приведет к изменению b [0] и наоборот. Таким образом, способ сделать это - создать массив указателей, каждый элемент которого должен принимать адрес struct variable, чтобы изменение переменной или элемента массива отражало измененное значение в другом.

0 голосов
/ 03 сентября 2018

В отличие от Python, C #, Java и JavaScript, копирование объекта выполняется по значению, а не по ссылке. Для простых объектов, которые не имеют указателей или ссылок, это означает, что копирование объекта, такого как struct Student, выполняется как глубокая копия.

Компилятор C ++ создает конструктор копирования для struct Student, который копирует поле за полем (рекурсивно) из s1 в sArr[0]. Вы можете определить свой собственный конструктор копирования, чтобы определить, как объект должен быть скопирован. В коде, подобном вашему, объект копируется, а не ссылка.

Если вы хотите только скопировать ссылку, то в вашем примере вы должны использовать указатели. Ссылки на Python, C # и Java являются сущностью, которая немного более ограничена, чем указатели C ++. Вот почему в вашем решении вам нужно будет использовать указатели:

struct Student 
{ 
  //struct info 
};
int main()
{ 
   Student s1, s2, s3, s4, s5;
   Student *sArr[5] = {&s1, &s2, &s3, &s4, &s5}; 
}

Когда у вас есть:

sArr[0]->age=10;

Затем возраст s1 обновляется.


Другая альтернатива - поместить объекты в массив и использовать именованные ссылки для доступа к ним:
struct Student 
{ 
  //struct info 
};
int main()
{ 
   Student sArr[5];
   Student &s1 = sArr[0];
   Student &s2 = sArr[1];
   Etc...
}

Разница между ссылками Python и ссылками C ++ заключается в том, что ссылки C ++ не могут быть переназначены и не могут быть нулевыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...