Указатели и ссылки на объекты
До сих пор доступ к членам объекта осуществлялся, используя операцию ".". Это правильно, если вы работаете с объектом. Однако доступ к членам объекта можно осуществлять и через указатель на объект. В этом случае обычно применяется операция стрелка "->".
Указатель на объект объявляется точно так же, как и указатель на переменную любого типа.
Для получения адреса объекта, перед ним необходим оператор &.
main()
{
_3d A (2,3,4);
_3d *pA;
pA = &A;
double dM = pA->mod();
}
В С++ есть элемент, родственный указателю - это ссылка. Ссылка является скрытым указателем, и всегда работает просто как другое имя переменной.
Наиболее важное использование ссылки - передача ее в качестве параметра. Чтобы разобрать в том, как работает ссылка, рассмотрим для начала программу, использующую в качестве параметра указатель.
void ToZero (_3d *vec)
{
vec->set (0,0,0); // используется " -> "
}
main()
{
_3d A (2,3,4);
ToZero (&A);
}
В С++ можно сделать то же самое, не используя указатели, с помощью параметра-ссылки.
void ToZero (_3d &vec)
{
vec.set (0,0,0); // используется " . "
}
main()
{
_3d A (2,3,4);
ToZero (A);
}
При применении параметра-ссылки, компилятор передает адрес переменной, используемой в качестве аргумента. При этом не только не нужно, но и неверно использовать оператор "*". Внутри функции компилятор использует переменную, на которую ссылается параметр-ссылка.
В отличие от передачи в качестве параметра объекта, использование ссылки-параметра предполагает, что функция, в которую передан параметр, будет манипулировать не копией передаваемого объекта, а именно этим передаваемым объектом.
Параметры-ссылки имеют некоторые преимущества по сравнению с аналогичными альтернативными параметрами-указателями. Во-первых, нет необходимости получать и передавать в функцию адрес аргумента, адрес передается автоматически. Во-вторых, ссылки предлагают более понятный и элегантный интерфейс, чем неуклюжий механизм указателей.
Ссылки могут также использоваться в качестве возвращаемого значения функции. Обычно такой механизм применяется в сочетании со ссылкой - параметром или указателем this. Все эти случаи объединяет необходимость передачи измененного объекта через его адрес, а не путем возвращения копии такого объекта. Вспомним хотя бы пример с переопределением оператора "=", где в качестве возвращаемого значения выступала копия измененного оператором "=" объекта. Теперь мы знаем, что можно сделать проще и эффективнее, если возвращать ссылку на измененный объект.
_3d& _3d::operator = (_3d& b)
{
x = b.x;
y = b.y;
z = b.z;
return *this;
}
Использование в качестве возвращаемого значения ссылку гарантирует, что возвращаемым в качестве результата этой функции будет именно тот объект, который вызывал операцию "=", а не его копия.
[назад] | [оглавление] | [вперед] |