[ターン]の関数として戻り値にC / C ++リファレンス

転送:https://blog.csdn.net/weixin_40539125/article/details/81410008

この記事は非常によく書かれています:

语法:类型 &函数名(形参列表){ 函数体 }

特記事項:

関数の戻り値として挙げ1は、関数名が定義されなければならないときに機能&

2.関数の戻り値として挙げ最大の利点は、メモリ内の戻り値のコピーを生成することはありません

  1.  
    //コード出典:RUNOOB
  2.  
    含める<iostreamの>
  3.  
    使用して名前空間はstdを、
  4.  
    フロート温度;
  5.  
    フロートFN1 フロートR){
  6.  
    一時= Rの* rの* 3.14;
  7.  
    温度を返します。
  8.  
    }
  9.  
    &フロートFn2がフロートR&LT)は{ 記載TEMPを、&への参照を返す//、言い換えれば、それ自体を返すTEMP
  10.  
    一時= Rの* rの* 3.14;
  11.  
    温度を返します。
  12.  
    }
  13.  
    INT メイン{()
  14.  
    =もう一度Fn1フロート(5.0); //ケース1:戻り値。
  15.  
    //フロート&B =のFN1(5.0); //ケース2:基準の初期値の関数として戻り値[エラー]タイプの非const参照の無効初期化型の右辺値から「フロート&「フロート」
  16.  
    //(いくつかのコンパイラが正常に文をコンパイルすることができますが、警告を与えます)
  17.  
    C = Fn2がフロート(5.0); //ケース3:参照を返します。
  18.  
    D =&Fn2がフロート(5.0); //ケース4:参照が新しい基準の初期値として関数によって返されます。
  19.  
    coutの<< << てendl; //78.5
  20.  
    //cout<<b<<endl;//78.5
  21.  
    coutの<< C << てendl; //78.5
  22.  
    coutの<< D << てendl; //78.5
  23.  
    リターン0;
  24.  
    }

ケース1:(以下に示すようにソース:ボレオンライン)の戻り値を持つ関数を呼び出します。

グローバル変数tempの戻り値は、C ++は、一時的な変数に値を一時変数と一時メモリ内コピーを作成するとき。メイン関数mainに戻した後、割り当て=のFN1(5.0)は、変数aに一時変数の値をコピーします

ケース2:(以下に示すように、ソース:ボレオンライン)参照関数の初期の戻り値が関数を呼び出します

この場合、関数もう一度Fn1()値は、モードに戻される一時変数TEMPの値の最初のコピーに戻ります。bは別名を一時的に可変できるように、主要な機能に戻った後、一時的な変数は、参照変数bを初期化。短期的、一時的な変数の範囲をするので(C ++標準では、一時的な変数やオブジェクトのライフサイクルは完全なステートメント式の終了後に最後に来て、それは、ステートメントが浮いている&B =のFN1(5.0);の後)、Bので、危険に直面して無効、値が決定できない未来値である可能性が高いです。

 あなたが本当に参照を初期化する関数の戻り値を使用したい場合は、最初の関数の戻り値を変数に代入され、変数を作成し、参照を初期化するために、その変数を使用する必要があります。

  1.  
    INT X = FN1(5.0)。
  2.  
    INT&B = X;

 ケース3:(以下に示すように、ソース:ボレオンライン)によって参照を返す関数を呼び出します

この場合、関数FN2()戻り値はコピーを生成しないが、直接メイン関数に変数TEMPリターンに、値の割り当て、すなわち左主な機能は、(すなわちから変数TEMPから直接コピーされます一時変数cは、このように一時変数の生成を避け、単なるコピーではなく別名)です。具体的には、変数tempがユーザー定義オブジェクトのクラスである場合、このプロセスは、コール・クラス・コピー・コンストラクタは、メモリ内の一時オブジェクト、時間と空間のプログラムのより効率的な利用を作成回避します。

ケース4:呼び出し元の関数への新たな基準値を初期化する方法として、関数参照を返します(以下に示すように、ソース:ボレオンライン)

この場合、関数Fn2が()のコピーは、戻り値が生成されず、直接、変数tempのための主要な機能に戻します。メイン関数では、戻り値を参照して、Dの初期化を宣言し、それはこの時点で言うことであることは、D別名変数TEMPとなります。一時はグローバル変数なので、一時dの生活の中でアクティブなままなので、このアプローチは安全ですので。

3.ローカル変数への参照を返すことができません。TEMPはローカル変数である場合は、上記の例のように、基準温度「意味無し」となるであろうこの時点で、関数が戻った後に破壊されるであろう未知の状態にプログラムを参照します。

4.参照されるメモリは、新たな割り当ての内部機能によって返すことはできません。ローカル変数の受動的な破壊はありませんが、参照が一時的な変数外観と関数によって返されますが、実際の変数に代入していない場合は、しかし、それは新しい割り当てでその基準点(スペースを引き起こす可能性があり)場合には、メモリリークが生じる、(特定の変数名が存在しないことは、それが手動で削除して、このメモリを解放することができない)に放出することができません。だから我々は起きてからこれを避ける必要があります

図5は、メンバーによって参照されるクラス、好ましくはconst参照を返す場合。これは、意図的でないの場合のクラスのメンバーへの損傷を防ぐことができます。

6.あなたは返さ代入式の関数リファレンス左辺値を使用することができます

  1.  
    #include<iostream>
  2.  
    using namespace std;
  3.  
    int value[10];
  4.  
    int error=-1;
  5.  
    int &func(int n){
  6.  
    if(n>=0&&n<=9)
  7.  
    return value[n];//返回的引用所绑定的变量一定是全局变量,不能是函数中定义的局部变量
  8.  
    else
  9.  
    return error;
  10.  
    }
  11.  
     
  12.  
    int main(){
  13.  
    func( 0)=10;
  14.  
    func( 4)=12;
  15.  
    cout<<value[0]<<endl;
  16.  
    cout<<value[4]<<endl;
  17.  
    return 0;
  18.  
    }

D.用引用实现多态

在C++中,引用是除了指针外另一个可以产生多态效果的手段。也就是说一个基类的引用可以用来绑定其派生类的实例

  1.  
    class Father;//基类(父类)
  2.  
    class Son:public Father{.....}//Son是Father的派生类
  3.  
    Son son; //son是类Son的一个实例
  4.  
    Father &ptr=son; //用派生类的对象初始化基类对象的使用

特别注意:

ptr只能用来访问派生类对象中从基类继承下来的成员。如果基类(类Father)中定义的有虚函数,那么就可以通过在派生类(类Son)中重写这个虚函数来实现类的多态。

 

おすすめ

転載: www.cnblogs.com/do-your-best/p/11229594.html