Статья о бесплатном использовании статических функций - PullRequest
2 голосов
/ 16 ноября 2011

Я ищу статью или документацию, объясняющую, почему свободная статическая функция лучше, чем закрытая функция-член, когда данная функция не изменяет и не читает приватные члены класса. На мой взгляд, преимущества:

  • Меньше зависимостей

  • Лучшая инкапсуляция (для «мамонтовых» классов полезно знать, что по крайней мере эти вызовы функций не изменяют членов)

Я уверен, что кто-то уже написал что-то лучше, чем то, что я могу сделать.

Ответы [ 4 ]

4 голосов
/ 16 ноября 2011

Бесплатные статические функции устарели.Вместо этого можно использовать функцию в анонимном пространстве имен.

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

3 голосов
/ 16 ноября 2011

Если вы специально ищете статью, вам следует прочитать «Элемент 23: Предпочитать функции, не являющиеся членами, не являющимися друзьями, функциям-членам» в Effective C ++ . Автор Scott Meyers.Я хотел бы предположить, что эта книга необходима для чтения всем серьезным программистам C ++.

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

3 голосов
/ 16 ноября 2011

Вы, кажется, неправильно используете некоторые слова, поэтому я попытаюсь уточнить

class myclass {
private: 
    int data;

    void func1(); // private mutator function
    void func2() const;  // private accessor function
    static void func3();  // private static function
public:
    int moredata;

    void func4(); // public mutator function
    void func5() const;  // public accessor function
    static void func6(); // public static function
}

void func7(myclass); // free function
static void func8(myclass); // static function can't be accessed outside file.

Как правило, перегрузки операторов, как правило, освобождают функции, поэтому их можно найти во время поиска, если требуется преобразование.
Закрытые функции используются, когда никакие внешние функции или классы не будут вызывать эти функции.
Статические функции используются, когда они не читают или не записывают в myclass, но являются неотъемлемой частью концепции класса.
Постоянные функции могут использоваться на const объектах и ​​не изменять класс.

1 голос
/ 16 ноября 2011
  1. encapsulation означает объединение соответствующих данных и функций. Так что это не имеет значения здесь.
  2. Если функция не изменяет переменные-члены, она помечается как const, но в зависимости от контекста она все еще может счастливо принадлежать class вместо того, чтобы быть вынужденной быть одинокой свободной static функцией.
  3. Лично (это можно обсудить) Я считаю, что вы должны объединить все соответствующие функции в один class или НА ОЧЕНЬ МЕНЬШЕ a namespace вместо того, чтобы оставлять их в покое.

    Хотя из java, из pov design это правильный пример: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html, http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html

...