В классах C ++ есть 5 членов по умолчанию. Конструктор по умолчанию, деструктор, конструктор копирования, оператор присваивания и оператор адреса.
Что такое адресный оператор? Это className* operator &() {}
?
Если это так, почему компилятор генерирует этот оператор адреса по умолчанию (поскольку у нас уже есть оператор адреса в C, и мы можем получить адрес объекта без этих дополнительных затрат)?
Есть ли какая-то особая цель?
Вы начинаете с неправильной предпосылки. специальные функции-члены являются (§12 [специальные] / р1)
Одинарный operator &
не является специальной функцией-членом, и не существует такой вещи, как сгенерированный компилятор operator &()
функция. Если ты пишешь
struct B {} b;
B *pb = &b;
то, что используется, является встроенным &
оператор. Нет вызова функции или накладных расходов. Он ведет себя так же, как если бы вы взяли адрес int
переменная.
Есть программисты, которые вручную перегружают унарные operator &
, Обычно это потрясающе плохая идея.
В разделе 13.3.1.2 Стандарта C ++, касающемся разрешения перегрузки операторов, можно найти следующее правило:
Если оператор является
operator ,
, одинарныйoperator &
, илиoperator ->
и если нет жизнеспособных функций, то оператор считается встроенным и интерпретируется в соответствии с разделом 5.
Если все типы были предоставлены с членом operator&
по умолчанию жизнеспособный набор никогда не может быть пустым. Поскольку существует правило, что делать, когда набор жизнеспособных элементов пуст, поэтому вы можете быть уверены, что у типов изначально нет члена operator&
,