Интернет, компьютеры, софт и прочий Hi-Tech | ||
Избранные докиМетки (все метки)internet, it, интернет, интернет сеть, информационные технологии, ит, по, программное обеспечение, сайт, софт
Подписаться через RSS2Email.ru
Дополнительномобильные, электроника, видеокарта, СКС, AXIS, аутсорсинг, интернет, сеть, радионяни, гаджеты |
Страница 2 из 10
- Предыдущая
- Следующая Краткий FAQ по C++РАЗДЕЛ [8]: Ссылки[8.1] Что такое ссылка?Ссылка - это псевдоним (другое имя) для объекта. Ссылки часто используются для передачи параметра по ссылке: void swap(int& i, int& j)
{
int tmp = i;
i = j;
j = tmp;
}
int main()
{
int x, y;
// ...
swap(x,y);
}
В этом примере i и j - псевдонимы для переменных x и y функции main. Другими словами, i - это x. Не указатель на x и не копия x, а сам x. Все, что вы делаете с i, проделывается с x, и наоборот. Вот таким образом вы как программист должны воспринимать ссылки. Теперь, рискуя дать вам неверное представление, несколько слов о том, каков механизм работы ссылок. В основе ссылки i на объект x - лежит, как правило, просто машинный адрес объекта x. Но когда вы пишете i++, компилятор генерирует код, который инкрементирует x. В частности, сам адрес, который компилятор использует, чтобы найти x, остается неизменным. Программист на С может думать об этом, как если бы использовалась передача параметра по указателю, в духе языка С, но, во-первых, & (взятие адреса) было бы перемещено из вызывающей функции в вызываемую, и, во-вторых, в вызываемой функции были бы убраны * (разыменование). Другими словами, программист на С может думать об i как о макроопределении для (*p), где p - это указатель на x (т.е., компилятор автоматически разыменовывает подлежащий указатель: i++ заменяется на (*p)++, а i = 7 на *p = 7). Важное замечание: несмотря на то что в качестве ссылки в окончательном машинном коде часто используется адрес, не думайте о ссылке просто как о забавно выглядящем указателе на объект. Ссылка - это объект. Это не указатель на объект и не копия объекта. Это сам объект. [8.2] Что происходит в результате присваивания ссылке?Вы меняете состояние ссыльного объекта (того, на который ссылается ссылка). Помните: ссылка - это сам объект, поэтому, изменяя ссылку, вы меняете состояние объекта, на который она ссылается. На языке производителей компиляторов ссылка - это lvalue (left value - значение, которое может появиться слева от оператора присваивания). [8.3] Что происходит, когда я возвращаю из функции ссылку?В этом случае вызов функции может оказаться с левой стороны оператора (операции) присваивания. На первый взгляд, такая запись может показаться странной. Например, запись f() = 7 выглядит бессмысленной. Однако, если a - это объект класса Array, для большинства людей запись a[i] = 7 является осмысленной, хотя a[i] - это всего лишь замаскированный вызов функции Array::operator[](int), которая является оператором обращения по индексу для класса Array: class Array {
public:
int size() const;
float& operator[] (int index);
// ...
};
int main()
{
Array a;
for (int i = 0; i < a.size(); ++i)
a[i] = 7; // В этой строке вызывается Array::operator[](int)
}
[8.4] Как можно переустановить ссылку, чтобы она ссылалась на другой объект?Невозможно в принципе. Невозможно отделить ссылку от ее объекта. В отличие от указателя, ссылка, как только она привязана к объекту, не может быть "перенаправлена" на другой объект. Ссылка сама по себе ничего не представляет, у нее нет имени, она сама - это другое имя для объекта. Взятие адреса ссылки дает адрес объекта, на который она ссылается. Помните: ссылка - это объект, на который она ссылается. С этой точки зрения, ссылка похожа на const указатель [18.5], такой как int* const p (в отличие от указателя на const [18.4], такого как const int* p). Несмотря на большую схожесть, не путайте ссылки с указателями - это не одно и то же. [8.5] В каких случаях мне стоит использовать ссылки, и в каких - указатели?Используйте ссылки, когда можете, а указатели - когда это необходимо. Ссылки обычно предпочтительней указателей, когда вам ненужно их "перенаправлять" [8.4]. Это обычно означает, что ссылки особенно полезны в открытой (public) части класса. Ссылки обычно появляются на поверхности объекта, а указатели спрятаны внутри. Исключением является тот случай, когда параметр или возвращаемый из функции объект требует выделения "охранного" значения для особых случаев. Это обычно реализуется путем взятия/возвращения указателя, и обозначением особого случая при помощи передачи нулевого указателя (NULL). Ссылка же не может ссылаться на разыменованный нулевой указатель. Примечание: программисты с опытом работы на С часто недолюбливают ссылки, из-за того что передача параметра по ссылке явно никак не обозначается в вызывающем коде. Однако с обретением некоторого опыта работы на С++, они осознают, что это одна из форм сокрытия информации, которая является скорее преимуществом, чем недостатком. Т.е., программисту следует писать код в терминах задачи, а не компьютера (programmers should write code in the language of the problem rather than the language of the machine). Страница 2 из 10 - Предыдущая - Следующая Последнее редактирование: 2009-10-02 15:19:55 Метки материала: C++, FAQ, программирование, ссылки, указатели, функции, параметры, объекты, передача по ссылке Оставьте, пожалуйста, свой комментарий к публикации |
|
© 2007-2012, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.