Почему оператор адреса является элементом по умолчанию класса C ++ и что это?

В классах C ++ есть 5 членов по умолчанию. Конструктор по умолчанию, деструктор, конструктор копирования, оператор присваивания и оператор адреса.

  1. Что такое адресный оператор? Это className* operator &() {}?

  2. Если это так, почему компилятор генерирует этот оператор адреса по умолчанию (поскольку у нас уже есть оператор адреса в C, и мы можем получить адрес объекта без этих дополнительных затрат)?
    Есть ли какая-то особая цель?

-1

Решение

Вы начинаете с неправильной предпосылки. специальные функции-члены являются (§12 [специальные] / р1)

  • конструктор по умолчанию — неявно объявляется, если нет объявленного пользователем конструктора
  • конструктор копирования и оператор присваивания копии — неявно объявляется, если не объявлено пользователем
  • конструктор перемещения и оператор присваивания перемещения — неявно объявляется, только если нет оператора или деструктора копирования / перемещения или оператора присваивания
  • деструктор — неявно объявленный, если не объявленный пользователем

Одинарный operator & не является специальной функцией-членом, и не существует такой вещи, как сгенерированный компилятор operator &() функция. Если ты пишешь

struct B {} b;
B *pb = &b;

то, что используется, является встроенным & оператор. Нет вызова функции или накладных расходов. Он ведет себя так же, как если бы вы взяли адрес int переменная.

Есть программисты, которые вручную перегружают унарные operator &, Обычно это потрясающе плохая идея.

3

Другие решения

В разделе 13.3.1.2 Стандарта C ++, касающемся разрешения перегрузки операторов, можно найти следующее правило:

Если оператор является operator ,, одинарный operator &, или operator ->и если нет жизнеспособных функций, то оператор считается встроенным и интерпретируется в соответствии с разделом 5.

Если все типы были предоставлены с членом operator& по умолчанию жизнеспособный набор никогда не может быть пустым. Поскольку существует правило, что делать, когда набор жизнеспособных элементов пуст, поэтому вы можете быть уверены, что у типов изначально нет члена operator&,

1

По вопросам рекламы [email protected]