Синтаксис конструктора копирования С++: является ли амперсанд ссылкой на значения r/l?

Ниже приведен отрывок из моего текста на C++, иллюстрирующий синтаксис объявления класса с помощью конструктора копирования.

class Student {
     int no;
     char* grade;
 public:
     Student();
     Student(int, const char*);
     Student(const Student&);
     ~Student();
     void display() const; 
 };

Конструктор копирования, как показано здесь:

Student(const Student&);

Имеет амперсанд после параметра Student.

Я полагаю, что в C и С++ символ амперсанда используется как оператор «адреса» для указателей. Конечно, стандартно использовать символ & перед имени указателя, а конструктор копирования использует его после, поэтому я предполагаю, что это не один и тот же оператор.

Другое использование символа амперсанда, которое я нашел, относится к значениям R и L, как показано здесь: http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html

Мой вопрос не о R-значениях и L-значениях, я просто хочу знать, почему символ & помещается после параметра, и как это называется, и если/почему это необходимо.


person bigcodeszzer    schedule 22.10.2015    source источник
comment
& означает, что это ссылка на const Student, а не копия. en.wikipedia.org/wiki/Reference_%28C%2B%2B% 29   -  person rlbond    schedule 23.10.2015
comment
Проверьте это stackoverflow.com/questions/1943276/ вы также можете проверить эту ссылку parashift.com/c++-faq- lite/references.html   -  person Deepanshu    schedule 23.10.2015
comment
Некоторые маньяки написали бы это как Student(Student const&)   -  person James    schedule 23.10.2015
comment
@geeksoul - Ваша вторая ссылка не работает.   -  person bigcodeszzer    schedule 23.10.2015
comment
@bigcodeszzer, он перемещен на isocpp.org/wiki/faq/references.   -  person Jonathan Wakely    schedule 23.10.2015
comment
Если у вас есть текст на C++, вы должны прочитать его.   -  person Jonathan Wakely    schedule 23.10.2015
comment
@JonathanWakely - см. комментарии под принятым ответом.   -  person bigcodeszzer    schedule 23.10.2015
comment
В учебнике /должно было быть сказано: Имейте в виду, C++ добавил еще одну ненужную функцию, чтобы все усложнить. Они называются «ссылками» и являются указателями, которые вы не можете изменить. Чтобы еще больше запутать уже в значительной степени неправильно понятую концепцию указателей, они даже использовали оператор & (и поймал! - он не имеет ничего общего с «адресом»)   -  person bigcodeszzer    schedule 23.10.2015


Ответы (1)


C++ имеет ссылочный тип, которого нет в C. & используется для определения такого типа.

int i = 10;
int& iref = i;

Здесь iref является ссылкой на i.

Любые изменения, внесенные в i, видны через iref, а любые изменения, внесенные в iref, видны через i.

iref = 10; // Same as i = 10;
i = 20;    // Same as iref = 20;

Ссылка может быть ссылкой lvalue или ссылкой rvalue. В приведенном выше примере iref является ссылкой lvalue.

int&& rref = 10;

Здесь rref — ссылка на rvalue.

Подробнее о ссылках на rvalue можно прочитать на странице http://en.cppreference.com/w/cpp/language/reference.

person R Sahu    schedule 22.10.2015
comment
Это похоже на команду процессора или действительно занимает память? В чем разница между типом int& и указателем? - person bigcodeszzer; 23.10.2015
comment
@bigcodeszzer int& реализован с использованием int*, это замаскированный указатель, адрес которого изменить нельзя. - person Zereges; 23.10.2015
comment
Это не операция препроцессора. Разница между указателем и ссылкой заключается в том, что указатель можно изменить так, чтобы он указывал на объект, отличный от того, которым он был инициализирован. С другой стороны, ссылка должна быть инициализирована, и то, на что она ссылается, не может быть изменено после этого. Это похоже на указатель, который нельзя изменить, чтобы он указывал на что-либо еще после его инициализации. - person R Sahu; 23.10.2015
comment
@bigcodeszzer Ссылки в основном используются для аргументов функций, поэтому вы можете назначать переменную вызывающей стороны без необходимости писать &var при вызове и *ptr при назначении. Это в основном просто функция удобства. - person Barmar; 23.10.2015
comment
@bigcodeszzer Разве все это не объясняется в вашем учебнике? Я не могу себе представить, что он использует примеры без объяснения их основ. - person Barmar; 23.10.2015
comment
@Barmar На самом деле это так, я, должно быть, пропустил это. Но, тем не менее, он не указывает его как тип данных, он просто объединил его с «передачей по ссылке», что означало нечто совершенно другое в C. - person bigcodeszzer; 23.10.2015