Объектно-ориентированное программирование на C++


Указатели и ссылки на объекты


До сих пор доступ к членам объекта осуществлялся, используя операцию ".". Это правильно, если вы работаете с объектом. Однако доступ к членам объекта можно осуществлять и через указатель на объект. В этом случае обычно применяется операция стрелка "->".

Указатель на объект объявляется точно так же, как и указатель на переменную любого типа.

Для получения адреса объекта, перед ним необходим оператор &.

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;

}

Использование в качестве возвращаемого значения ссылку гарантирует, что возвращаемым в качестве результата этой функции будет именно тот объект, который вызывал операцию "=", а не его копия.

[назад] [оглавление] [вперед]

Содержание раздела