2011-12-26 9 views
3

考慮する属性?クラスオブジェクトは常に参照によって渡されるため、Bref Bを返すのは同じですか?Dメンバ関数は、

第2:pureメンバー機能?純粋な関数は、引数に依存するものだけを返すことです。したがって、同じ引数が渡されても関数の出力を変更する可能性があるので、クラスのデータメンバーに依存しないはずです。したがって、pureメンバ関数もstaticメンバ関数ですか? (逆の場合があります)

3番目:constと不変のメンバークラスの違いは何ですか?不変クラスオブジェクトとconstクラスオブジェクトのメンバー関数呼び出しを区別するには?意味的には、両方の属性を持つデータメンバーを変更することはできません。

第4に、できるだけ多くの機能属性を追加する必要がありますか? pureのように、constまたはimmutable,nothrowおよびfinal

inout(B) f() inout 
{ 
    return b; 
} 

答えて

5

ref B f()は、参照によってBを返す関数です。 Bはクラス参照です。 Ergo、参照によってクラス参照を返します。

auto a = new A; 
a.f() = new B; // rebinds a.b, possible due to return by ref 

同様に、あなたはまた、Dにクラス参照へのポインタを持つことができます:クラス参照がリバウンドすることができので、これは、Dでナンセンスではないpureメンバ関数について

class A 
{ 
    B b; 

    /* ... */ 

    B* f() 
    { 
     return &b; 
    } 
} 

auto a = new A; 
B* b = a.f(); // pointer to reference to instance of class B 
*b = new B; // updates a.b 

、暗黙のthis参照パラメータはちょうどそれです - 別のパラメータ。これは入力の一部とみなされます。同一のthisオブジェクトと同じ通常のパラメータでは、出力は常に同じです。 constメンバ関数で


thisオブジェクトが可変か不変である場合、あなたは知りません。それはいずれかである可能性があります - constメンバ関数は、とにかくそれを変更しないことを約束します。 immutableメンバ関数では、thisオブジェクトは常に不変です。したがって、this参照は、不変の引数として別の関数に渡すことも、不変の変数に代入することもできます。


についてconstimmutablepurenothrowを気にするときを決定するとき、あなたはあなたが実際にクライアントコードでこれらの様々な保証を必要とするかどうかを検討する必要があります。一般的な目的でライブラリを作成している場合は、おそらくこれを知らないので、これらの場合は可能な限り多くの保証を提供することをお勧めします。

おそらくfinalの状況は異なっています。オーバーライドする意味がない関数や、オーバーライドされない関数をクライアントコードが誤って上書きしないようにする場合や、コンパイラにその関数への呼び出しを最適化する機会を増やしたい場合に使用します。任意の関数をオーバーライドしない(override)最終関数は、仮想関数である必要はなく、呼び出しオーバーヘッドを削減します。

+0

完全にモジュール化されたコードの場合、すべての関数は純粋ですか? –

+1

@Daeviusでは、純粋な関数から不純な関数を呼び出すことはできません。これは、システムコールとそのすべてに依存します。私はこの尺度で、あなたのコードは決して "完全に"モジュール化されることはないと考えています。それは常に、ある種のモノスタットに依存します。 –

+0

「純粋な」の詳細については、最近の質問があります:http://stackoverflow.com/questions/8572399/how-is-this-pure-functionable-to-modify-non-private-state –

2

ので、Bとref Bを返すことは等価である:


素晴らしい、ちょうどこの作品を発見?

auto a = new A; 
auto b = new B; 
b.i = 55; 
a.f() = b; 
writeln(a.b.i); // 55 

pureメンバ関数:

ref関数がこのように可能に、左辺値を返すことができますか?

メンバ関数はインスタンスをパラメータの1つとして取る自由関数と考えることができます。

class A { pure void f(int others) immutable; } 
<=> 
    class A { ... } 
    pure void f(immutable(A) this, int others); 

したがって、純粋なメンバ関数は依然として読むことができ、それは単にパラメータの一つであるとして、this(弱純粋なもののために)変更します。


のconstと不変のメンバクラスの違いは何ですか?

あなたは


☺何を意味するのかわからない私は、多くの機能が可能と属性を追加する必要がありますか?

機能に最も適した機能属性を追加する必要があります。関数が決してにオーバーライドされる場合は、finalを追加します。それはが例外をスローすることはありません場合は、

(関数はテンプレート関数であればところで、purenothrow@safeを推測することができる。)など、nothrow追加

3

REFストレージクラスメンバー関数の前にあるfは重複していますか?クラスオブジェクトは常に参照によって渡されるため、Bref Bを返すのは同じですか?

refを追加あなたは書き込みによってbフィールド(実際の参照だけではなく、その内容を)変更することができます:a.f() = new B();

第二:pureメンバ関数?

純粋な方法では、別の引数としてthisを扱うと信じています。

第3世代:constと不変のメンバークラスの違いは何ですか?不変クラスオブジェクトとconstクラスオブジェクトのメンバー関数呼び出しを区別するには?意味的には、両方の属性を持つデータメンバーを変更することはできません。

はい、しかしimmutableバージョンは強い保証を持っています。

第4位:できるだけ多くの機能属性を追加する必要がありますか? pureのように、constまたはimmutable,nothrowおよびfinal

あなたが作成しているコードを使用するときに便利なように、多くの属性を追加してください。現在の実装では、冗長属性を検出することはあまりよくありません。

関連する問題