0

違いは何ですか

教科書に書かれていること:

MyClass& Myclass::operator++() {
  do something
  return *this;
}

MyClass Myclass::operator++() {
  do something
  return *this;
}

*「が指す値」を意味します ....

2 番目の例は、this が指すオブジェクトのコピー (*this のコピー) を返しますが、最初の例は *this 自体を返しますか?

これが事実である場合、それはどのような違いをもたらしますか?実行時間を改善するには?

4

3 に答える 3

0

回答で既に述べたように、最初のものは参照を返し、2番目のものはコピーを作成しています。主な違いは、セマンティクスが完全に異なることです。以下を考慮してください。

const auto & r = ++a;
++a;
assert(a == r);    // true/false depending on what is returned

prefix の特定のケースではoperator++、正しいセマンティクス (ほとんどのユーザーが期待するもの) が参照を生成しています。他のことをすると混乱が生じ、ソース コードのバグの原因になる可能性があります。

より一般的な質問では、関数に事前定義された予期されるセマンティクスがない場合でも、違いは使用に関して同じです。コピーするとコストが高くなりますが (コピーにコストがかかる可能性のある型の場合)、参照セマンティクスが必要な場合は参照を生成する必要があり、コピー セマンティクスが必要な場合は値で返す必要があります。それがどんなに安くても高くても。

費用に関しては、実際に行っていることによっては、予想よりも少なくなる場合があることに注意してください。呼び出し元が戻り値を使用して新しいオブジェクトを初期化する場合、コストはおそらく RVO が起動して不要な余分なコピーを削除するのと同じになるでしょう。

于 2013-04-14T17:00:19.337 に答える