Где Вы использовали бы друга функция по сравнению со статической функцией членства?

Мы делаем не являющуюся членом функцию другом класса, когда мы хотим, чтобы это получило доступ к членам парламента, не занимающим официального поста того класса. Это дает ему те же права доступа, как статическая функция членства имела бы. Обе альтернативы дали бы Вам функцию, которая не связана ни с каким экземпляром того класса.

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

Например, при реализации фабрики, которая создает экземпляры класса foo который только имеет частного конструктора, должен та функция фабрики быть статическим членом foo (Вы звонили бы foo::create()) или если это - друг функция (Вы звонили бы create_foo())?

61
задан Joseph Mansfield 8 February 2013 в 21:10
поделиться

8 ответов

Раздел 11.5 " Язык программирования C ++ »Бьярна Страуструпа утверждает, что обычные функции-члены получают 3 вещи:

  1. доступ к внутренним компонентам класса
  2. находится в области видимости класса
  3. должен быть вызван для экземпляра

друга ] получают только 1.

статические функции получают 1 и 2.

69
ответ дан 24 November 2019 в 17:10
поделиться

Статическую функцию можно использовать по-разному.

Например, как простая фабричная функция:

  class Abstract {
  private:
    // no explicit construction allowed
    Abstract(); 
    ~Abstract();

   public:
     static Abstract* Construct() { return new Abstract; }
     static void Destroy(Abstract* a) { delete a; }
   };

   ...
   A* a_instance = A::Conctruct();
   ...
   A::Destroy(a_instance);

Это очень упрощенный пример, но я надеюсь, что он объясняет, что я имел в виду.

Или как функция потока, работающая с Вашим классом:

 class A {

 public:
    static void worker(void* p) {
            A* a = dynamic_cast<A*>(p);
            do something wit a;
    }   
 } 

 A a_instance;
 pthread_start(&thread_id, &A::worker, &a_instance);
 .... 

Друг - это совершенно другая история, и их использование точно соответствует описанию thebretness

0
ответ дан 24 November 2019 в 17:10
поделиться

Вот что я думаю:

Функция друга - когда вам нужен доступ к другому члену класса, но классы не связаны между собой. Статическая функция - когда вам не нужен доступ к указателю this. Но у меня такое чувство, что это еще не все ....

-1
ответ дан 24 November 2019 в 17:10
поделиться

Статическая функция - это функция, не имеющая доступа к this .

Функция друга - это функция, которая может обращаться к закрытым членам класса.

0
ответ дан 24 November 2019 в 17:10
поделиться

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

Вы используете функцию или класс друга, когда вы создали код, который не является членом вашего класса и не должен быть членом вашего класса, но имеет законную цель для обхода частных / защищенных механизмов инкапсуляции. Одна из целей этого может заключаться в том, что у вас есть два класса, которым нужны некоторые общие данные, но дважды кодировать логику было бы плохо. На самом деле, я использовал эту функциональность только в 1% классов, которые когда-либо кодировал. Это редко нужно.

1
ответ дан 24 November 2019 в 17:10
поделиться

Статические функции используются, когда вы хотите, чтобы функция была одинаковой для всех экземпляров класса. Такие функции не имеют доступа к указателю this и, следовательно, не могут получить доступ к нестатическим полям. Они часто используются, когда вам нужна функция, которую можно использовать без создания экземпляра класса.

Дружественные функции - это функции, которых нет в классе, и вы хотите предоставить им доступ к закрытым членам вашего класса.

И это (статичное против друга) не связано с использованием одного против другого, поскольку они не являются противоположностями.

4
ответ дан 24 November 2019 в 17:10
поделиться

С точки зрения профессионального развития вы должны иметь возможность реализовать все, что вам может понадобиться; в какой-то день вам, вероятно, придется реализовать что-то, чего не существует в библиотеке, а также, вероятно, придется время от времени изобретать новые алгоритмы.

Однако, чтобы быстрее начать работать, сначала узнайте, как оценить структуру данных библиотеки или шаблона; какова его временная стоимость, стоимость памяти, ремонтопригодность и т.д. Это заставит тебя написать лучше код раньше. Но не останавливайтесь на достигнутом, научитесь и их реализовывать. Изучите реализации библиотек с открытым исходным кодом, чтобы вы знали, как они работают, а не только то, что они делают.

-121--1614379-

Highline делает не совсем то, что вы описываете, но, возможно, он достаточно близок.

-121--3107573-

Стандарт требует, чтобы оператор = () [] и - > должны быть членами, а специфичные для класса
операторы new, new [], delete и delete [] должны быть статическими членами. Если ситуация
возникает, когда нам не нужен объект класса, чтобы вызвать функцию, затем сделать
функция статична. Для всех остальных функций:
если для функции требуются операторы = () [] и - > для потокового ввода-вывода,
или если требуется преобразование типа в крайнем левом аргументе, или если он может быть реализован только с помощью открытого интерфейса класса, сделать его не участником (и другом, если это необходимо в первых двух случаях)
если он должен вести себя виртуально,
добавить функцию виртуального члена для обеспечения виртуального поведения
и осуществить в соответствии с этим
else
сделать его членом.

2
ответ дан 24 November 2019 в 17:10
поделиться

Дружественные функции (и классы) могут получить доступ к закрытым и защищенным членам вашего класса. Редко бывает удачно использовать функцию или класс друга. Избегайте их вообще.

Статические функции могут обращаться только к статическим данным (т. Е. К данным на уровне класса). Их можно вызывать без создания экземпляра вашего класса. Статические функции отлично подходят в тех случаях, когда вы хотите, чтобы все экземпляры вашего класса вели себя одинаково. Вы можете использовать их:

  • как функции обратного вызова
  • для управления членами в области класса
  • для извлечения постоянных данных, которые вы не хотите перечислять в файле заголовка
  • 5
    ответ дан 24 November 2019 в 17:10
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: