2016-11-30 14 views
5

私はC++でプログラミングするのがとても新しいです。これがばかだとごめんなさい。私はC + +の本の本を介して作業している、と私はちょうど傾けることができない何か私の周りの頭を取得します。私は、全オブジェクトに&収入を販売台数が働いて、トランスオブジェクトのそれと組み合わされることを得るメンバ関数でクラスオブジェクトを返すのはどういう意味ですか?

total.combine(trans); 

Sales_data& Sales_data::combine(const Sales_data &rhs) 
{ 
    units_sold += rhs.units_sold; 
    revenue += rhs.revenue; 
    return *this; 
} 

そして、我々は使用して関数を呼び出します。たとえば、この機能を取ります複合代入演算子(+ =)とよく似ています。あなたは1のコールをチェーンできることを意味(に呼び出されるオブジェクトへの)参照によって返す

答えて

9

...

は、私は、これは、全オブジェクトを返すことを得るが、私は、全オブジェクトを返すことは何を意味するかを取得いけませんラインコード。すべてのこれらの呼び出しは、同じオブジェクトにバインドされます:

total.combine(trans).combine(trans2).combine(trans3); 

と等価である:(もちろん、それはあなたが同じメソッドを呼び出す必要が意味するものではありません、あなたとミックスでき

total.combine(trans); 
total.combine(trans2); 
total.combine(trans3); 

同様の特性を有する他の方法)

このイディオムは、しばしば連鎖と呼ばれることが可能であるoperator=operator<<operator>>などのような演算子の実装で使用されている:。

a = b = c; 
cout << a << b << c; 
7

これは、自身への参照を返します。これにより、メソッドチェーンが可能になります。あなたはこれがtotalオブジェクトが間で変更することができます参照を返すので

Sales_data s1, s2, total; 
//stuff.. 
total.combine(s1).combine(s2); 

:たとえば、あなたは2つのSales_dataオブジェクトを持っていて、それらの両方を組み合わせたい、あなたはその後、「チェーン」のコールができ を言いますこれは「チェーン」と呼ばれる理由です。

3

この例では、totalへの参照を返します。これにより、式total.combine(trans)が変更されたtotalオブジェクトとして使用できるようになります。

operator<<Sales_dataのためにオーバーロードされた場合、我々は単純に組み合わせることができますし、印刷は次のように合計を変更:私たちは、同じオブジェクトのために多くの時間を結合したい場合のように、

std::cout << total.combine(trans); 

または私たちすることができますチェーン方法この:この例では

total.combine(trans).combine(trans1); 

totalが組み合わされ、そして同じtotalオブジェクトが返され、我々はすでに変更されたオブジェクトで一回以上結合することができます。

これは、変更されたオブジェクトを同じ式で使用する必要がある場合に、コードを単純化するのに適したパターンです。

3

上記のサンプルでは、​​クラスの後に参照記号&が使用されています。* thisを使用して、既存のクラスオブジェクトへの参照を渡すことができます。すべての参照を返すことは、スタック上のオブジェクトへのポインタを返すことです。これは、デイジーチェーンコールでは構文的に便利です。

total.combine(trans).combine(trans2).combine(trans3); 
関連する問題