3

これは、 return ステートメントでのコンストラクターの呼び出しからのフォローアップの質問です。

これは、クラスでの演算子オーバーロードの楽しみです。

const Integer operator+(const Integer& IntObject)
{
    cout << "Data : " << this->data << endl;
    return Integer(this->data + IntObject.data); 
}

そのような関数の戻り値の型における const の関連性は何ですか?

int main()
{
    Integer A(1); //Create 2 object of class Integer

    Integer B(2);

    const Integer C = A + B;  //This will work

    Integer D = A + B;        //This will also work

    fun(A + B);               //Will work
}

void fun(Integer F) {}

これは、NRVO が原因で返品ステップ中に一時が作成されない場合です。返されるオブジェクトは、呼び出し先のアドレスで直接構築されます。

4

3 に答える 3

8

より良い例を次に示します。

struct Foo
{
    void gizmo();
    Foo const operator+(Foo const & rhs);
};

今、あなたが持っているなら、Foo x; Foo y;あなたは言うことができません:

(x + y).gizmo();  // error!

定数の戻り値は、非定数の操作には使用できないことを意味します。プリミティブ型の場合、これはそれほど関連性がありません。一時オブジェクトで実行できる非定数操作は多くないためです。一時オブジェクトでは多くの「興味深い」操作(プレフィックスなど++)が許可されていないためです。

とは言うものの、C ++ 11では、定数値を返さないという新しいイディオムを実際に採用する必要があります。これは、非定数値が最適化を移動できるようになったためです。

于 2012-06-08T08:03:53.113 に答える
4

のようなナンセンスを書くのを防ぐために、そうすることを提案する人もいましたA + B = C。ただし、C ++ 11では、戻り値が移動できなくなるため、一部の最適化が妨げられる可能性があります。したがって、あなたはそれをすべきではありません。

この場合、のような完全に有効なコードを書くこともできなくなりますが、これは、作成D = A + B + C者が演算子の宣言を忘れたためconstです。

于 2012-06-08T08:05:41.273 に答える
3

戻り値のコピーを作成しているため、コード スニペットには関連性がありません。

const一般に、値を返す正当な理由を見つけるのは困難です。const一時的に非定数メソッドを呼び出そうとすると、このタイプの式で効果があることがわかります。

(someObject.someMethodReturningConstValue()).someNonConstMethod(); // error, calls non const method on const temporary

そのため、一時的に const 以外のメソッドを呼び出すことを許可しない場合にのみ使用してください。一方で、C++11 ではムーブ セマンティクスが無効になるため、推奨されません。

于 2012-06-08T08:02:09.493 に答える