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
参照は、不変の引数として別の関数に渡すことも、不変の変数に代入することもできます。
についてconst
、immutable
、pure
とnothrow
を気にするときを決定するとき、あなたはあなたが実際にクライアントコードでこれらの様々な保証を必要とするかどうかを検討する必要があります。一般的な目的でライブラリを作成している場合は、おそらくこれを知らないので、これらの場合は可能な限り多くの保証を提供することをお勧めします。
おそらくfinal
の状況は異なっています。オーバーライドする意味がない関数や、オーバーライドされない関数をクライアントコードが誤って上書きしないようにする場合や、コンパイラにその関数への呼び出しを最適化する機会を増やしたい場合に使用します。任意の関数をオーバーライドしない(override
)最終関数は、仮想関数である必要はなく、呼び出しオーバーヘッドを削減します。
完全にモジュール化されたコードの場合、すべての関数は純粋ですか? –
@Daeviusでは、純粋な関数から不純な関数を呼び出すことはできません。これは、システムコールとそのすべてに依存します。私はこの尺度で、あなたのコードは決して "完全に"モジュール化されることはないと考えています。それは常に、ある種のモノスタットに依存します。 –
「純粋な」の詳細については、最近の質問があります:http://stackoverflow.com/questions/8572399/how-is-this-pure-functionable-to-modify-non-private-state –