2011-11-15 4 views
2

私は、与えられた関数がクラスのプライベートメンバーを変更したり読み取ったりしないときに、フリーの静的関数がプライベートメンバー関数より優れている理由を説明する記事またはドキュメントを探しています。私の視点に利点は以下のとおりです。無料スタティック関数の使用についての記事

  • あまり依存関係

  • より良いカプセル化(「マンモス」のクラスのために、それは、少なくともこれらの関数呼び出しは、メンバーを変更していないことを知ることができます)

誰かが私ができることよりも優れたものをすでに書いていることは確かです。

答えて

3

特に記事をお探しの場合は、Scott Meyersの "Item 23:メンバー以外の機能をメンバー機能に優先する"(Effective C++)をお読みください。私は、この本はすべての深刻なC++プログラマーのための必須の読書であることをお勧めします。

このトピックの基本的な前提は、クラスの既存のインターフェイスメソッドを使用してフリー関数を実装できる場合、クラスを実際に単純化する必要があるということです。つまり、クラスの内部を見ることができるコードが少なくなればなるほど、それはよりカプセル化されます。実際にさらに膨らませると、は、カプセル化をに減らします。

+0

これは私が考えていたものですが、覚えていないものです。ありがとう! – Palmira

4

無料の静的関数は大雑把です。代わりに匿名の名前空間に関数を使用します。

プライベートメンバーにアクセスできないため、実装の詳細の変更に対して堅牢です。静的メンバー関数は、実装の詳細とは独立していても構いませんが、コンパイラがそれを検証する必要はありません。

+0

私はあなたが持っているポイントが好きです。実装の詳細の変更に対して頑強です – Palmira

+0

"無料の静的関数は大雑把です"。しかし、匿名の名前空間で宣言されたエンティティは外部のリンケージを持っているので、リンク時の問題のために.cpp内の古い静的宣言を使用しました。それからAppart、結果は同じではない? – Palmira

+0

外部リンケージがあり、テンプレートなどで使用できるようになります。そうでない場合の動作は同じです。匿名の名前空間の関数のためにリンク時間の問題が発生する理由を理解できません。 –

1
  1. encapsulationは、関連するデータと機能を組み合わせることを意味します。だからここでは無関係です。
  2. 関数がメンバ変数を変更しない場合、それはconstとマークされますが、文脈によっては幸いにも、孤独なフリーのstatic関数ではなくclassに属します。
  3. 個人的に(これは議論することができます)すべての関連する機能をまとめて、classまたはすべての機能をまとめてnamespaceにまとめてください。 Javaから

    ものの、デザインのPOVから、これは有効な例です:http://download.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.htmlhttp://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html

+0

1.私は同意しません(Effective C++の記事については次の記事を参照してください)。 – Palmira

+0

2.私は.cpp内の自由なstratic関数を好むため、+ break依存関係を機能させるためにprivateインタフェースを変更したり必要としないようにします。 – Palmira

+0

3.私はこれが私の元の質問とは関係ないと思います。ディベート。クラスのクライアントとして、私は "MyClass a; a.doSomething();"毎回。原則として、オブジェクトを破棄する前に関数をビルドして呼び出すのは、常に同じクライアントである場合...これは有用なオブジェクトではありません。私はMaxClass myMaxCalculatorObjectよりもmax(a、b)を優先します。 myMaxCalculatorObject.ComputMax(); – Palmira

3

あなたは、私は一般的に

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オブジェクトで使用でき、クラスを変更しないでください。

+0

クラスの外部で 'static'を使用して内部リンケージを得ることができます。したがって、 'static void func7(myclass);'も合法です。 –

+0

クラスのメンテナンス性について質問していたので、私はそれを残しました。それは実際に関連していないリンケージのことです。私は完了のためにそれを加えた。 –

+0

私は正しい言葉を使ったと思う。しかし確かに私は自分自身を明確にしました。私は 'funct8 'を静的なフリー関数(通常は.cppにあります)と呼びます。また、" func2 "はprivateメンバー関数です。 – Palmira

関連する問題