1

次のコードを検討してください。

#include <iostream>
using namespace std;
class loc 
{
    int longitude, latitude;
    public:
        loc() {}
        loc(int lg, int lt) 
        {
            longitude = lg;
            latitude = lt;
        }
        loc(const loc& l)
        {
            cout << "a" << endl;
        }
        loc operator = (loc op2)
        {
            longitude = op2.longitude;
            latitude = op2.latitude;
            return *this;
        }
        loc operator+(loc op2);
};
loc loc::operator+(loc op2) {
    loc temp;
    temp.longitude = op2.longitude + longitude;
    temp.latitude = op2.latitude + latitude;
    return temp;
}
int main()
{
    loc ob1(10, 20), ob2( 5, 30);
    ob1 = ob1 + ob2;
    return 0;
}

コマンド: を使用してこのプログラムをコンパイルするg++ file.cppと、出力は次のようになりました。

a
hello

次に、コマンドを使用してこのプログラムをコンパイルします: g++ -fno-elide-constructors file.cpp、出力は次のとおりです。

a
a
a
hello

私の質問は:

最初のケースで、2 つのコピー コンストラクターが省略されているのはなぜですか?

とにかく、どのコピーコンストラクターが省略されていますか? = 演算子または + 演算子には別のメカニズムがありますか

編集

正しい代入演算子またはコピー コンストラクターがどのように見えるべきかを知っています。代入演算子を修正するのではなく、上記のケースで 2 つのコピー コンストラクターが省略されている理由を答えてください。

4

1 に答える 1

1

1 つの省略されたコピーは、op+ からのリターンです。RVO を使用すると、最終的な宛先で結果を直接構築し、temp完全に省略することができます。省略されたコピーはtemp.

省略された 2 番目のコピーは、一時的な op+ の結果を op= に渡しています。代わりに、op+ の結果がop2パラメーターで直接構築されるように調整します。これは RVO ではなく、通常の一時的な省略です。

于 2014-11-16T08:59:00.483 に答える