「参照」を関数として値タイプのフォーマット、メリット、および遵守するルールを返しますか?

2679 ワード

フォーマット:タイプ識別子&関数名(パラメータリストおよびタイプ説明){//関数体}
メリット:メモリに戻り値のコピーが生成されません.(注意:そのため、ローカル変数の参照を返すのは望ましくありません.このローカル変数の生存期間が終わるにつれて、対応する参照も失効するため、runtime errorが発生します!注意事項:
(1)ローカル変数の参照を返すことはできません.これは、Effective C+[1]のItem 31を参照することができる.主な理由は、ローカル変数が関数の戻り後に破棄されるため、返される参照が「指なし」の参照となり、プログラムが未知の状態になるためです.
(2)関数内部newで割り当てられたメモリの参照を返すことができない.これは、Effective C+[1]のItem 31を参照することができる.局所変数のパッシブ破棄の問題は存在しないが,この場合(関数内部のnew割り当てメモリの参照を返す)には,他の気まずい状況に直面する.例えば、関数によって返される参照は一時変数として現れるだけで、実際の変数が与えられていないと、この参照が指す空間(newによって割り当てられる)は解放されず、memory leakとなる.
(3)クラスメンバーの参照を返すことができますが、constが望ましいです.この原則は、Effective C+[1]のItem 30を参照することができる.主な理由は、オブジェクトのプロパティがビジネス・ルールに関連付けられている場合、その付与は他のプロパティまたはオブジェクトのステータスに関連することが多いため、付与操作をビジネス・ルールにカプセル化する必要があるからです.他のオブジェクトが属性の非常に多くの参照(またはポインタ)を取得できる場合、属性の単純な付与はビジネス・ルールの完全性を破壊します.
(4)フローオペレータ再ロード戻り値が「参照」として明示される役割:
ストリームオペレータ<<と>>は、cout<<「hello」<#include<iostream.h> int &put(int n); int vals[10]; int error=-1; void main() { put(0)=10; // put(0) , vals[0]=10; put(9)=20; // put(9) , vals[9]=20; cout<<vals[0]; cout<<vals[9]; } int &put(int n) { if (n>=0 && n<=9 ) returnvals[n]; else { cout<<"subscripterror"; return error; } }
(5)他のオペレータでは、+-*/四則演算子を返すことはできません.それらは参照を返すことができず、Effective C++[1]のItem 23はこの問題を詳細に議論した.主な理由は、この4つのオペレータにside effectがないため、オブジェクトを戻り値として構築する必要があります.オプションとして、オブジェクトを返し、ローカル変数の参照を返し、newで割り当てられたオブジェクトの参照を返し、静的イメージ参照を返します.前述した参照を戻り値とする3つのルールに基づいて,2,3の2つのスキームはいずれも否決された.静的オブジェクトの参照は、((a+b)=(c+d))が常にtrueであるため、エラーが発生します.オプションは1つのオブジェクトを返すだけです.