1

+ 演算子をオーバーロードすると、これを使用できます (クラスが className であると仮定します)

 className operator+(className & c) { // version 1
    className T;
    ...
    return T;
}

また、私は使用することができます

className operator+(className & c) {   // version 2
    ....
    return *this;
}

ここに私の質問があります:

  1. バージョン 2 では、参照を返しますか? なぜ?

  2. バージョン 1 とバージョン 2、どちらが優れていますか?

  3. 私たちはチェーン =/<< を使用するためにオーバーロード =, << return by reference を書くことがよくありますが、なぜ参照なしではチェーン =/<< を使用できないのでしょうか。

  4. もう 1 つの質問は、効果的な C++ で見た「可能な限り const を使用する」および「参照渡しを使用することを好む」ということです。

私がこのように書くと:

template<typename T> 
void Print(const T data[], const int & arraySize)  // i use the const, and &
{ 
   for(inti = 0; i < arraySize; ++i) 
   cout << data[i] << " "; 
   cout << endl; 
}

main() 関数を記述するときは、次のように記述します。

int iArray[14] = {7,3,32,2,55,34,6,13,29,22,11,9,1,5}; 
int numInts = 14;    // do I need to specify numInts is const?? 

Print(iArray, numInts);

4

1 に答える 1

1

バージョン 2 では、参照を返しますか? なぜ?

関係ありません、それは間違っています。

バージョン 1 とバージョン 2、どちらが優れていますか?

バージョン 1. 2 番目のものはthisオブジェクトを変更するため、書き込みx + yが変更されてしまいx、意味がありません。

私たちはチェーン =/<< を使用するためにオーバーロード =, << return by reference を書くことがよくありますが、なぜ参照なしではチェーン =/<< を使用できないのでしょうか。

参照がなければ、コピー (一時) を返すだけなので、そのような状況では連鎖は意味がありません。chainedを記述=すると、呼び出されたオブジェクトではなく、別のオブジェクトに呼び出しが適用さ=れます。

もう 1 つの質問は、<> で見た「可能な限り const を使用する」および「参照渡しを使用することを好む」ということです。これは、可能な限り const と参照を使用するクラス関数宣言を作成するということですか?

あまり。意味がある場合に使用してください。たとえば、引数を変更するべきではないためoperator +、your は理にかなっています。constこれにより、バージョン 2 のコンパイラ エラーも発生します (これは良いことです)。

参照渡しについては、内部で変更していない場合は、大きなオブジェクトに優先する必要があります -intまたは- 値渡し。float

于 2012-10-20T06:34:15.257 に答える