C ++関数として基準パラメータに

C ++関数として基準パラメータに

これは、引数として引用しました

C ++参照型の増加が、それは主に展開するためのパラメータとして関数である理由関数の電荷伝達関数データを。

--------------------

C ++、伝達関数パラメータ:
(1)引数パラメータとして変数名。この場合、値は一方向であるパラメータ変数送信に渡されます。パラメータ値の変化の関数の実行中にした場合、引数には戻りません。関数を呼び出すとき、パラメーター、および引数が同じメモリセルではありませんので。// Cと


(2)ポインタ変数を渡します。パラメータは、ポインタ変数、引数は変数のアドレスであり、関数呼び出し、点引数可変部のパラメータ(ポインタ変数)です。この値は、パラメータ引数ポインタにより変更することができます。// Cと


(3)C ++を提供する参照変数送信します。パラメータが参照変数であり、引数は、変数、関数は、点引数変数に、パラメータ(基準変数)と呼ばれるユニット。この引数はパラメータ基準の値によって変更することができます。

 

#include <iostream>
using namespace std;
void funcr(int &num , int x)
{
    cout<<"in funcr,addr is:"<<&num<<endl;//对比地址,等于原地址
    num = x ;//会改变传入参数的值。 
}

void func(int num , int x)//不能写成void funcr(int num , int x),不正确的重载,导致不知道该调用谁。
{
    cout<<"in func,addr is:"<<&num<<endl;//对比地址,有所变化
    num = x ;//只会在函数内改变拷贝变量的值,不会改变传入的参数值
} 

int main() {
    int x = 100;
    int &rx = x ;
    cout<<"addr_x:"<<&x<<endl;
    cout<<"addr_rx:"<<&rx<<endl;//变量地址和它的引用地址相同


    funcr(x,177);//改变传入参数的值,不管代码中传的是变量本身还是引用   
    cout<<"after funcr , x="<<x<<endl;

    funcr(rx,211);  //改变传入参数的值          
    cout<<"after funcr , rx="<<x<<endl;

    func (rx,233); //不会改变传入参数的值,不管代码中传的是变量本身还是引用                 
    cout<<"after func , rx="<<x<<endl;

    while(1);
    return 0 ;
} 
结果:
addr_x:0xbf82293c
addr_rx:0xbf82293c
in funcr,addr is:0xbf82293c
after funcr , x=177
in funcr,addr is:0xbf82293c
after funcr , rx=211
in func,addr is:0xbf822920
after func , rx=211

 

1.値が渡されます。オブジェクトはクラスオブジェクトの値が大きな構造物やオブジェクトが渡されている場合、関数は、スタックプロセスを属するパラメータデータのコピーは、いくつかの時間と空間がかかります。

2.ポインタを渡す:パラメータは、関数がスタック処理属するデータのコピーを持っているが、データのコピーは、4バイトのアドレスに固定されています。

3.参照伝送:同じ上述したデータ処理をコピーし、それは、データが存在するからエイリアスアドレスに対応することをアドレスするためのものです。

効率の点で、ポインタは参照によって渡され、伝送効率の高い変速比。よりコンパクトな変速機の基準を使用しての一般的な考え方は、コード・ロジックをクリア。

参照渡しのDo関数のパラメータは、「C ++の機能である、C言語がサポートしていません。

たとえば、次のようなデータ構造と&なし&と

&パラメータは、参照型は、変化パラメータで参加し、実際には、アドレスが渡されている変更され、パラメータは、一般的なパラメータ値は、実際には、転送されることなく、&、参照パラメータとして変更しない変更されました。したがって、構造変化、および使用の参照パラメータの、または一般的なパラメータを指定して、この変更を返す必要があります。GetElemは、(L、i)はそうL&上記のパラメータを追加しない、線状の構造を変更しないで、i番目の要素の値に単純です。ListInsert(&L、I、e)は、i番目の線形リストLに挿入される線形リストの要素eの要素の値は、Lの構成は、長さ増加を変更したので、Lの前および追加されなければなりません。、それは追加の要素を示していない、ディスプレイLていない場合は、Lは、ディスプレイの長さであり、まだ実際の長さより1少ない前回値から増加する、です。

 

 

 

公開された18元の記事 ウォン称賛86 ビュー160 000 +

おすすめ

転載: blog.csdn.net/u013178472/article/details/104969327