функция друга, cpp - PullRequest
       28

функция друга, cpp

1 голос
/ 22 сентября 2011

У нас в школе было задание по реализации класса Matrix, который перегружает все арифметические операторы. То, что я сделал, было (например) определить + = как функцию-член, а затем определить + как функцию, не являющуюся членом, которая использует функцию + = (обе в том же файле, но + вне класса). Сотрудники школы сделали нечто подобное, только они объявили «+» как функцию друга (и также использовали реализацию + =).

Поскольку обе реализации работают отлично, я пытаюсь понять, что дает мне функция друга, а функция, не являющаяся членом, - нет? Когда мне следует отдавать предпочтение друг другу?

Спасибо! Yotam

Ответы [ 3 ]

4 голосов
/ 22 сентября 2011

Желательно не объявлять функции друзьями, если они могут быть реализованы в терминах открытого интерфейса класса (например, operator+ в терминах члена operator+=.

Почему-то с операторами иногда люди склонны считать, что при реализации в качестве бесплатных функций они должны автоматически объявляться друзьями. Например, вы можете услышать, что operator<< не может быть реализован как функция-член (потому что левый операнд является ostream), поэтому он должен быть свободной friend функцией. В действительности он должен быть другом только в том случае, если ему нужен доступ к закрытым / защищенным членам и функциям.

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

1 голос
/ 22 сентября 2011

Прочитав определение функции друга, вы получите ответ на свой вопрос.

функция друга используется в объектно-ориентированном программировании для обеспечения доступа к закрытым или защищенным данным в классе извне. Обычно функция, которая не является членом класса, не может получить доступ к такой информации; ни один не может внешний класс. Иногда такой доступ будет выгоден для программиста. При таких обстоятельствах функцию или внешний класс можно объявить как друга класса с помощью ключевого слова friend. Функция или внешний класс будут иметь доступ ко всей информации - публичной, частной или защищенной - внутри класса.

1 голос
/ 22 сентября 2011

Друг версия имеет доступ к членам вашего класса.Обычного не члена нет.Это может быть полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...