Вопрос о & оператор в C ++ - PullRequest
1 голос
/ 10 мая 2009

Я смотрю на файл .h класса Wrapper. И класс содержит один закрытый член:

T* dataPtr;

(где T такое же, как в template < class T >, определенном в верхней части файла .h)

Класс предоставляет два метода "* оператора перегрузки":

T& operator*()
{
   return *dataPtr;
}

const T& operator*() const
{
  return *dataPtr;
}

Оба просто возвращают *dataPtr, но что на самом деле возвращает запись "*dataPtr" в простом английском языке? И как это согласуется с типом возврата "T&"?

Ответы [ 4 ]

6 голосов
/ 10 мая 2009

Возвращаемый тип T & заявляет, что вы возвращаете ссылку на экземпляр T-объекта. dataPtr - это указатель, который вы «разыменовываете» (получаете ссылочное значение / экземпляр указателя), используя *.

2 голосов
/ 10 мая 2009

dataPtr - указатель на что-то.

Оператор * разыменовывает указатель, поэтому * dataPtr (или вместо «есть» можно сказать «ссылается на» или «является ссылкой на») указателем, то есть на то, на что указывает dataPtr.

T & означает «ссылку на объект с типом T» (не путать с T *, что означает «указатель на объект с типом T»).

1 голос
/ 10 мая 2009

Кажется, что класс-оболочка действует как указатель C ++.

Оператор * разыменовывает оболочку, которая будет оценивать то, что он хранит (в dataPtr). То, что вы получаете, является ссылкой на это содержание. Например. Вы можете назначить что-то на ссылку

*intWrapper = 42;

Есть два оператора, потому что есть постоянная и непостоянная версия. Когда вы разыменовываете константный класс-обертку, вы не можете присвоить ему (возвращается константная ссылка (T &))

1 голос
/ 10 мая 2009

*DataPtr - фактические данные, на которые указывает DataPtr. Оба оператора возвращают ссылку на T. ссылка - это тип, который вы должны рассматривать как другое имя для значения, к которому оно относится. «Под капотом» это похоже на указатель, но не думай об этом так. Он не может делать указатель по математике или быть «перезаписан». Один из операторов - const и используется для объекта const, а другой - для обычного объекта.

...