参照パラメータと参照パラメータ
2179 ワード
背景:
c cのパラメータ転送は値に従って転送され、大きなデータ項目がある場合、データのコピーに時間がかかり、パフォーマンスの問題が発生します(もちろんポインタを使用して回避できます).
c++ 1.値別に渡す2.リファレンスによる転送により、大量のデータのコピーオーバーヘッドを回避し、パフォーマンスを向上
参照
1.参照は別名で、宣言時に初期化する必要があります.実際のコードでは主に関数のパラメータとして使用されます.参照はターゲットの別名として使用され、参照の変更は、ターゲットの変更に相当します.
出力結果:
5 5
7 7
2.参照とポインタの違い:
1.ポインタは変数であり、ポインタを他の場所に再び値を割り当てることができ、参照は別名であり、確立時に初期化しなければならず、他の異なる変数には関連付けられない
2.ポインタも変数であるため、ポインタ変数の参照を持つことができるが、void参照は合法ではない.
3.参照のパラメータ転送:関数に参照を転送しましょう.パラメータにポインタを転送する効果は同じです.しかし、参照はポインタよりもパラメータとしてより明確な構文を有する.
例:二数交換を実現する
例:値による転送、参照による転送、ポインタによる転送
出力結果:a=1,b=10,c=10;
fooのvalueは値によって伝達され、aの値は伝達スタックのコピーに相当し、関数伝達終了はコピーを修正しただけで、関数伝達終了はコピーを修正しただけで、fooを呼び出した後のaの値はまだ1である.
barにおけるvalueの伝達は参照であり,参照の修正と元の値の修正は同じである.
zooにおけるvalueの伝達はポインタであり,ポインタ対は修正に値し,元の値も修正される.
4.
4.参照および参照パラメータの使用の意味
a.関数は1つの値しか返されません.プログラムが2つの値を返す必要がある場合、解決策の1つは、チェーンの各パラメータを参照して伝達し、関数がターゲット関数に正しい値を注入することです.
b.関数が値を返す場合、値のコピーを生成し、戻り値を参照する場合はコピーを生成する必要がないため、パフォーマンスが向上します.
注:ローカル参照を返さないでください.
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, 。
}