[解決済み】C++の戻り値、参照、const参照
2022-01-31 10:49:53
質問
戻り値、値への参照、値への const 参照の違いについて教えてください。
値です。
Vector2D operator += (const Vector2D& vector)
{
this->x += vector.x;
this->y += vector.y;
return *this;
}
Not-const referenceです。
Vector2D& operator += (const Vector2D& vector)
{
this->x += vector.x;
this->y += vector.y;
return *this;
}
Constの参照。
const Vector2D& operator += (const Vector2D& vector)
{
this->x += vector.x;
this->y += vector.y;
return *this;
}
これの利点は何でしょうか?関数にconst参照を渡すことの意味は、関数内で参照が指している値を変更しないようにしたいので、理解できます。しかし、const リファレンスを返すことの意味がよくわかりません。なぜ参照を返すことが値を返すことよりも良いのか、なぜ const 参照を返すことが not-const 参照を返すことよりも良いのでしょうか?
どのように解決するのですか?
などと変なことを書かない限り、違いはありません。
(v1 += v2) = v3;
最初のケースでは、割り当てが一時的なものになり、全体の効果は次のようになります。
v1 += v2
.
2つ目のケースでは、割り当て先が
v1
ということで、全体の効果としては
v1 = v3
.
3番目のケースでは、代入は許可されません。このような奇妙なことはほぼ間違いなく間違いなので、これはおそらく最良の選択肢でしょう。
なぜ値を返すより参照を返す方が良いのですか?
オブジェクトのコピーを作成する必要がないため、より効率的である可能性があります。
<ブロッククオートまた、なぜ const 参照を返す方が not-const 参照を返すよりも良いのでしょうか?
上記の例のような奇妙な連鎖を防ぎつつ、以下のような奇妙でない連鎖を可能にします。
v1 = (v2 += v3);
しかし、コメントにあるように、それはあなたの型が組み込み型と同じ形式の(ab)使用をサポートしないことを意味し、それを望ましいと考える人もいます。
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] 変数を参照渡しする方法を教えてください。
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] const std::string & をパラメータとして渡す時代は終わったのでしょうか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】shared_ptrは参照で渡すべきか、値で渡すべきか?
-
[解決済み】なぜ、constでない参照は一時的なオブジェクトにバインドできないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。