C++学習ノート:引用


C++学習ノート:引用
  • 1.引用紹介
  • 2.参照とポインタの比較
  • 3.引用の本質的剖析
  • 3.1参照はconst修飾
  • を加えることができる.
  • 3.2参照およびsizeof演算子
  • 3.3参照の本質はconstポインタ
  • である.


    1.引用紹介C言語では、次の2つの交換変数値を実現する関数について、関数伝達は関数値であり、swap1()は完了しないが、swap2()は可能である.
    #include
    
    void swap1(int a,int b)
    {
         
    	int tmp=a;
    	a=b;
    	b=tmp;
    }
    
    void swap2(int* pa,int* pb)
    {
         
    	int tmp=*pa;
    	*pa=*pb;
    	*pb=tmp;
    }
    
    int main(int argc,char**argv)
    {
         
    	int a = 10,b = 20;
    	printf("   a=%d,b=%d
    "
    ,a,b); swap1(a,b);// a b printf("swap1 ,a=%d,b=%d
    "
    ,a,b); swap2(&a,&b);// a b ,& printf("swap2 ,a=%d,b=%d
    "
    ,a,b); return 0; }

    実行結果:
       a=10,b=20
    swap1 ,a=10,b=20
    swap2 ,a=20,b=10
    
    C++で参照を使用できます.ここでの&は参照を表し、&はアドレス記号ではなく定義と識別の鍵を使用します.
    void swap3(int& a,int&b)
    {
         
    	int tmp=a;
    	a=b;
    	b=tmp;
    }
    

    参照は主に関数パラメータと戻り値で使用され、参照記号は定義時に同時に初期化されなければならず、後で別途値を割り当てることはできず、使用するしかありません.
    2.参照とポインタの比較
  • 1. CおよびC++はいずれもポインタを有し、使用方法および実装は本質的に全く同じであるが、参照はC++でのみ使用可能である.
  • 2.リファレンスは、機能が弱く、セキュリティが強化された低レイアウトポインタとして理解できます.
  • 3.引用できることは針でもできるが、針でできることは引用できるとは限らない.
  • 4.参照は変数の「別名」を指し、操作参照はそれに関連する変数を操作することに等しい.これは参照の使用効果の観点から言えば、ポインタに詳しい人にはかえって「別名」という言葉を理解しにくい.
  • 5.参照がポインタより弱いところは、参照定義時に変数をバインドし、後で変更できないことです.引用が針より強いところも直すことができないので、「野針」の問題はなく、より安全です.

  • 3.引用の本質剖析
    3.1引用はconst修飾を加えることができる
    int a=10;
    const int &b = a;
    
    // b=55;       
    a =44//           
    

    ここで、baであるconstの別名はaによって値を変更することができるが、bによってaを変更することはできない.
    参照とconst修飾は主に関数パラメータで使用され、関数内部で実パラメータの値が変更されないことをユーザーに伝えます.const以外の変数がある場合がありますが、ある関数呼び出しの過程で、変数の値が関数内部で変更されることを望んでいません.この場合、const参照で参照できます.
    3.2参照とsizeof演算子sizeof参照は、参照自体のサイズではなく、参照が指すターゲット変数のサイズを参照しますが、structまたはclassで参照を定義し、sizeof全体でstructまたはclassが異なります.
    3.3参照の本質はconstポインタである
    int &b = a;
    

    次のようになります.
    int * const b = &a;
    
    C++規格では、リファレンスがメモリ領域を占有するかどうかは規定されていませんが、ほとんどのコンパイラはリファレンスをconstポインタに実装しているので、ほとんどのコンパイラでリファレンスもメモリ領域を占有します.参照は天然constなので、定義時に指向変数を初期化する必要があります.そうしないと意味がありません.
    参照は本質的にポインタであり、アドレスであるため、アドレス呼び出しの効果を実現することができ、参照はポインタが定義時にポインタ変数自体をconst化したことである.