среда, 6 февраля 2013 г.

перегрузка операторов new delete

Синтаксис языка не позволяет различить целевой объект и саму ссылку все операции над ссылкой на самом деле являются операциями над объектом. Как следствие этого:

Ссылка, как и указатель, хранит в себе адрес объекта в памяти, однако синтаксически является разыменованным указателем. Это позволяет решить поставленные выше задачи, но создает новые проблемы.

В С++ операция обращения к элементу массива трактуется как вызов функции-члена operator[](size_t n). И должна вернуть нечто, что может стоять слева от оператора присваивания. И нужен тип, который бы позволил описать это. Так появились ссылки.

С точки зрения С программиста, выражение «foo(42) = 7;» лишено здравого смысла и не должно компилироваться, однако с появлением перегрузки операторов, возникла потребность именно в таких выражениях.

В этом маленьком примере три выражения: переменная a, литерал «5» и вызов функции foo(42) имеют одинаковый тип int, но только переменная является lvalue и может стоять слева от оператора присваивания.

Ссылки в C++ появились чтобы удовлетворить синтаксические потребности механизма перегрузки операторов. В чистом С нет ссылочных типов, вместо этого есть понятие lvalue, которое описывается размытой формулировкой «то, что может стоять слева от оператора присваивания».

Disclaimer: На данный момент я не располагаю достаточным опытом работы с С++11, поэтому все рассуждения следует рассматривать исключительно в контексте С++03, однако буду рад обсудить в комментариях взаимодействие нововведений С++ с рассмотренными в статье проблемами.

Что не так с ссылками в С++ / Хабрахабр

Комментариев нет:

Отправить комментарий