Заставить члена функционировать другом - PullRequest
7 голосов
/ 06 декабря 2010

Что произойдет, если вы сделаете функцию-член класса своим другом!?

Приведенный ниже код компилируется и запускается.Без объявления друга генерируется «слишком много аргументов для оператора» (и это правильно).Я понимаю, что делать это не имеет никакого смысла, но кто-нибудь может сказать мне, что здесь происходит?Друг заставляет компилятор каким-то образом пропустить этот параметр по умолчанию?

class Test
{
public:
  friend bool operator<(Test& lhs, Test& rhs)
  {
     return true;
  }
};

int main( int c, char** argv)
{
  Test test1;
  Test test2;

  return test1 < test2;
}

Ответы [ 2 ]

9 голосов
/ 06 декабря 2010

Разница в том, что друг не является членом, даже если все определение присутствует внутри класса; скорее функция помещена в окружающее пространство имен. Таким образом, указатель this отсутствует. В то время как член operator< неявно работает с this и явным аргументом правой стороны, для friend требуется как аргумент левой, так и правой стороны, предоставляемый явно в качестве параметров функции - отсюда и дополнительный параметр. Ваша версия friend эквивалентна размещению функции после класса, за исключением того, что она имеет доступ к элементам и базам private и protected и неявно inline (хотя это не означает, что компилятор должен встроить это - всего лишь подсказка, но она важна в отношении правила единого определения, поскольку ваша friend функция может быть включена из многих блоков перевода и связываться без проблем).

1 голос
/ 06 декабря 2010

Что происходит, когда вы превращаете функцию-член класса в своего друга!?

Это не имеет никакого смысла. Как функция-член класса может быть другом того же класса?

Вы перегружены operator < как функция друга (не как функция члена). Предоставление определения (тела) функции-друга внутри класса является законным. Однако использование this в его определении

запрещено
friend bool operator<(Test& lhs, Test& rhs)
{
     *this ; //error
     return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...