Где бы вы использовали функцию друга вместо статической функции-члена? - PullRequest
59 голосов
/ 23 февраля 2010

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

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

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

Ответы [ 15 ]

0 голосов
/ 12 октября 2016
  1. Статические члены данных всегда разделяют память.
  2. только статическая функция может использовать статические элементы данных.
  3. Статическая функция-член может вызываться с именем класса.
  4. Они должны быть определены вне класса, когда мы создаем объект статического члена или функции-члена в классе. Это автоматически инициализирует значение.
  5. Всегда используется ключевое слово static.
  6. Статические члены могут делиться всеми объектами.
  7. Тип и область действия членов-данных и функций-членов вне класса.
  8. Статическая переменная-член должна быть определена вне класса.
0 голосов
/ 15 февраля 2013

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

Эти методы становятся статичными, которые вызываются так много раз, что объявляют разные места внутри каждого объекта, поскольку они становятся слишком дорогостоящими (с точки зрения памяти). Это можно сделать с помощью примера: Пусть имя класса является фактом, а его членом данных является n (которое представляет собой целое число, факториал которого имеет значение) тогда в этом случае объявление find_factorial () как статического было бы мудрым решением !!

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

Теперь у нас возникли следующие вопросы ..

Когда используется функция друга? Когда используется статическая функция?

Теперь, если оба варианта являются жизнеспособными вариантами решения проблемы, Мы можем взвесить их пригодность с точки зрения доступности (доступности личных данных) и эффективности памяти. По умолчанию никто не может быть предпочтительным, так как существует много ситуаций, когда нам нужно лучшее управление памятью, а иногда мы обеспокоены объемом данных.

Например: foo :: create () предпочтительнее create_foo (), когда мы должны вызывать метод create () после каждого небольшого момента времени, и нас не интересует объем данных (личные данные)

И если нам интересно получить конфиденциальную информацию более чем одного класса (классов), то create_foo () будет предпочтительнее, чем foo :: create ().

Надеюсь, это поможет вам !!

0 голосов
/ 23 февраля 2010

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

Например, как простая заводская функция:

  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 голосов
/ 23 февраля 2010

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

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

0 голосов
/ 23 февраля 2010

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

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

...