& переменной - PullRequest
       1

& переменной

1 голос
/ 03 февраля 2011

Я где-то читал, что в C ++ нельзя дать определение, например:

int& a;

но только:

int b;  
int& a=b;  

Поскольку & является ссылкой на другую переменную, ее нельзя определить отдельно. С другой стороны, я вижу, что это все время определяется в коде отдельно.

Может ли кто-нибудь объяснить мне, как вы можете определить

int & a;   

без указания ссылки на переменную?

Ответы [ 4 ]

7 голосов
/ 03 февраля 2011

Вы можете увидеть его в классе, но вам нужно назначить его при инициализации во всех конструкторах, например,

class X
{
    int & a;
public:
    X(int & i) :a(i) {}
};
5 голосов
/ 03 февраля 2011

Учитывая стандарт C ++, вы не можете объявлять унифицированную ссылку отдельно:

Не должно быть ссылок на ссылки, массивов ссылок и указателей на ссылки. Объявление ссылки должно содержать инициализатор (8.5.3), за исключением случаев, когда объявление содержит явный спецификатор extern (7.1.1), является объявлением члена класса (9.2) в объявлении класса или является объявлением параметра или тип возврата (8.3.5); см. 3.1. Ссылка должна быть инициализирована для ссылки на действительный объект или функцию. [Примечание: в частности, пустая ссылка не может существовать в четко определенной программе, потому что единственный способ создать такую ​​ссылку - это привязать ее к «объекту», полученному путем разыменования нулевого указателя, что вызывает неопределенное поведение. Как описано в 9.6, ссылка не может быть привязана непосредственно к битовому полю. ]

—ISO / IEC 14882: 1998 (E), стандарт ISO C ++, в разделе 8.3.2 [dcl.ref]

1 голос
/ 03 февраля 2011

& не определяет псевдоним; это ссылка, которая похожа на урезанный указатель. Они не могут быть повторно инициализированы, поэтому вы должны указать «псевдоним» в начале.

0 голосов
/ 03 февраля 2011

Вы должны использовать указатель. Ссылочная нотация сводится к указателю, только она не может быть нулевой. Вот почему вы не можете просто объявить переменную как int & a. Возможно, существует исключение для членов класса (то есть они могут быть определены как ссылки), но ссылки должны быть установлены в конструкторе (см. Ответ PigBen).

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