参照パラメータと参照パラメータ


背景:
c cのパラメータ転送は値に従って転送され、大きなデータ項目がある場合、データのコピーに時間がかかり、パフォーマンスの問題が発生します(もちろんポインタを使用して回避できます).
c++ 1.値別に渡す2.リファレンスによる転送により、大量のデータのコピーオーバーヘッドを回避し、パフォーマンスを向上
参照
1.参照は別名で、宣言時に初期化する必要があります.実際のコードでは主に関数のパラメータとして使用されます.参照はターゲットの別名として使用され、参照の変更は、ターゲットの変更に相当します.
#include 

using namespace std;

int main(int argc, char *argv[])
{
    int a = 5;
    int &r = a;
    cout  <

出力結果:
5  5 
7  7
2.参照とポインタの違い:
1.ポインタは変数であり、ポインタを他の場所に再び値を割り当てることができ、参照は別名であり、確立時に初期化しなければならず、他の異なる変数には関連付けられない
2.ポインタも変数であるため、ポインタ変数の参照を持つことができるが、void参照は合法ではない.
int * a = NULL;

int *& r= a;

int b = 8;

r = &b;

3.参照のパラメータ転送:関数に参照を転送しましょう.パラメータにポインタを転送する効果は同じです.しかし、参照はポインタよりもパラメータとしてより明確な構文を有する.
例:二数交換を実現する
using namespace std;

void swap (int& x, int& y)
{
    int temp;
    temp = x;
    x= y;
    y =temp;
}

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;
    swap(a,b);
    cout <

例:値による転送、参照による転送、ポインタによる転送
#include 

using namespace std;

void foo(int val)
{
    val = 10;
}
void bar(int& val)
{
    val = 10;
}
void zoo(int *pval)
{
    *pval = 10;
}
int main(int argc, char *argv[])
{
    int a = 1;
    int b = 1;
    int c = 1;
    foo(a);
    bar(b);
    zoo(&c);
    cout <

出力結果:a=1,b=10,c=10;
fooのvalueは値によって伝達され、aの値は伝達スタックのコピーに相当し、関数伝達終了はコピーを修正しただけで、関数伝達終了はコピーを修正しただけで、fooを呼び出した後のaの値はまだ1である.
barにおけるvalueの伝達は参照であり,参照の修正と元の値の修正は同じである.
zooにおけるvalueの伝達はポインタであり,ポインタ対は修正に値し,元の値も修正される.
4.
4.参照および参照パラメータの使用の意味
a.関数は1つの値しか返されません.プログラムが2つの値を返す必要がある場合、解決策の1つは、チェーンの各パラメータを参照して伝達し、関数がターゲット関数に正しい値を注入することです.
b.関数が値を返す場合、値のコピーを生成し、戻り値を参照する場合はコピーを生成する必要がないため、パフォーマンスが向上します.
注:ローカル参照を返さないでください.
int result = 0
int& func(int r)     //ok,    ,result           
{
    result = r * r;
    return result;
}


int& func (int r)
{
    int result = 0;
    result = r * r;
    return temp;       //error,                            。
}