2012-05-29 8 views
2

На некоторых местах я видел переменные, объявленные как этотОбъявление константную переменную в качестве ссылки

const int &var1; 
extern int & var2; 

Эти переменные определены где-то в другом месте. Я всегда думал, что когда вы объявляете ссылку на переменную, вы привязываете ссылку к этой переменной в том же месте. Мне что-то не хватает. Кроме того, я не видел ссылки, объявленные выше, когда нет определителя (например, const или extern).

+3

Являются ли эти глобальные переменные, локальные переменные (в функции) или членом класса переменные? Обычно в качестве ссылок есть переменные-члены класса, и вы инициализируете их в списке инициализаторов конструктора. –

+0

Это переменные-члены класса. Любое особое преимущество в этом стиле? И можно ли объявить все переменные-члены класса, подобные этому, или есть какие-то ограничения? – polapts

ответ

2

Фактическое объявление переменной, пусть оно является ссылкой или указателем или нормальной переменной, не имеет ничего общего с типом переменной.

Даже если в ваших примерах есть ссылки на переменные, это означает, что ничего не связано с тем, где они инициализируются. Наличие ссылки полезно, потому что вы назначаете ее из другой переменной, и вы можете фактически использовать их в качестве указателя, не заботясь о том, чтобы разглядеть его, но не более того, это переменная, как и любая другая.

+0

За исключением того, что вы не можете по умолчанию инициализировать ссылку или назначить ей. Таким образом, существуют некоторые ограничения относительно того, где они инициализируются, если они являются членами данных. – juanchopanza

+1

«Фактическое объявление переменной, пусть оно является ссылкой или указателем или нормальной переменной, не имеет ничего общего с типом переменной». - кроме того, что объявление указывает тип. –

+0

Конечно, ссылка должна быть инициализирована, так как это ссылка. Я имел в виду, что ограничение ссылочной инициализации не имеет никакого отношения к сфере применения декларации. Ссылка должна быть инициализирована в блоке кода, который фактически выполняется в контексте, связанном с объявлением, например конструктором. – Jack

6
const int &var1; 

это незаконно, если он не является частью class или struct. Если это так, он должен быть инициализирован в конструкторе список инициализаторов.

Причина, по которой это законно, состоит в том, что переменная не существует, пока не будет создан объект этого класса. Таким образом, нет несвязанной ссылки, о чем не говорится.

1
int main() 
{ 
    const int &var1; 
} 

prog.cpp: In function ‘int main()’:

prog.cpp:4: error: ‘var1’ declared as reference but not initialized

prog.cpp:6: error: assignment of read-only reference ‘var1’

EDIT: Как уже сказал, что это может быть частью class и инициализируется в конструкторе

Смежные вопросы