C++の参照を浅く分析(&)

9192 ワード

リファレンスはC++が導入した新しい言語特性であり、C++でよく使われる重要な内容の一つであり、リファレンスを正確かつ柔軟に使用することで、プログラムを簡潔かつ効率的にすることができる.私は仕事の中で発見して、多くの人がそれを使うのはただ当然だと思って、いくつかの微妙な場面で、間違いやすくて、その原由を究明して、大部分は本源を明らかにしていないためです.だから本編では引用について詳しく議論し、引用をよりよく理解し、使用するためにレンガを投げて玉を引く役割を果たすことを望んでいます.
一、引用紹介引用はある変数(目標)の別名であり、引用に対する操作は変数に対する直接操作と全く同じである.引用の宣言方法:タイプ識別子&引用名=目標変数名;【例1】:
int a; int &ra=a; //    ra,    a   ,   

説明:(1)&ここではアドレス演算ではなく、識別の役割を果たします.(2)タイプ識別子は、ターゲット変数のタイプを指します.(3)参照を宣言する場合は、同時に初期化する必要があります.(4)参照宣言が完了すると、ターゲット変数名に相当する2つの名前、すなわち、そのターゲット元名と参照名があり、その参照名を他の変数名の別名として使用することはできない.ra=1;a=1に等価である.(5)参照を宣言し、新たに定義された変数ではなく、その参照名がターゲット変数名の別名であることを示すのみであり、それ自体がデータ型ではないため、参照自体がメモリセルを占めず、システムも参照にメモリセルを割り当てない.したがって、参照にアドレスを求めることは、ターゲット変数にアドレスを求めることである.&raは&aと等しい.(6)配列の参照は作成できません.配列は複数の要素からなる集合であるため、配列の別名は作成できません.
二、引用応用1、引用がパラメータ引用としての重要な役割の一つは関数としてのパラメータである.従来のC言語では関数パラメータ伝達は値伝達であり,大きなデータがパラメータ伝達として用いられていた場合,ブロック全体をスタック化することを避けることができ,プログラムの効率を向上させることができるため,ポインタを用いることが多かった.しかし、現在(C++では)同様に効率的な選択(特定の場合に必要な選択)が追加されており、参照である.【例2】:
void swap(int &p1, int &p2) //       p1, p2    
{ 
    int p; 
    p=p1; 
    p1=p2; 
    p2=p; 
}

この関数をプログラムで呼び出すには、対応するプライマリ・コール関数の呼び出しポイントで、パラメータ変数に特別な要求がなくても、変数を実パラメータとして直接呼び出せばよい.たとえば、上記で定義したswap関数に対応して、対応するプライマリ・コール関数は次のように書くことができます.

int main( )
{
 int a,b;
 cin>>a>>b; // a,b
 swap(a,b); // a b swap
 cout<

, 10 20 , 20 10。
【 2】 :
(1) 。 , , ( ) 。
(2) , , ; , , , ; , 。 , , 。
(3) , , , ”* ” , ; , , 。 , 。
, , 。

2、
:const & = ;
, , const, 。
【 3】:
:

int a ;
const int &ra=a;
ra=1; //
a=1; //

, 。
【 4】: :
:

string foo( );
void bar(string & s);


bar(foo( ));
bar(“hello world”);
foo( ) ”hello world” , C++ , const 。 const const , 。
const , const 。

3、
, :
& ( )
{ }

(1) , &
(2) , 。
【 5】 fn1( ), fn2, 。

#include<iostream>
float temp; //      temp
float fn1(float r); //    fn1
float &fn2(float r); //    fn2
float fn1(float r) //    fn1,             
{
 temp=(float)(r*r*3.14);
 return temp;
}
float &fn2(float r) //    fn2,           
{
 temp=(float)(r*r*3.14);
 return temp;
}
int main() //   
{
 float a=fn1(10.0); // 1   ,           (     )
 float &b=fn1(10.0); // 2   ,     (   C++       )
 //                        
 float c=fn2(10.0); // 3   ,           
 //                   
 float &d=fn2(10.0); // 4   ,           
 //                   
 cout<<a<<c<<d;
 return 0;
}

, :
(1) 。 Effective C++[1] Item 31。 , ” ” , 。
(2) new 。 Effective C++[1] Item 31。 , ( new ), 。 , , , ( new ) , memory leak。
(3) , const。 Effective C++[1] Item 30。 (business rule) , , 。 ( ), 。
(4)
<< >>, , :cout << “hello” << endl;  。 : 。 , ( ) , , << ! 。 << 。 , 。 , , C++ 。 =。 , , :x = j = 10; (x=10)=100; , 。 。
【 6】 。

#include <iostream>
int &put(int n);
int vals[10];
int error=-1;
void main()
{
    put(0)=10; // put(0)       ,   vals[0]=10;
    put(9)=20; // put(9)       ,   vals[9]=20;
    cout<<vals[0];
    cout<<vals[9];
}
int &put(int n)
{
    if (n>=0 && n<=9 ) return vals[n];
    else { cout<<"subscript error"; return error; }
}

(5) , :+-*/ 。 ,Effective C++[1] Item23 。 side effect, , , : 、 , new 、 。 , 2、3 。 ((a+b) == (c+d)) true 。 。

4、
。 , 。
【 7】:

class  A;
class  Bpublic A{……};
B  b;
A  &Ref = b; //                 

Ref , 。 A , B , Ref 。


(1) , , , 。
(2) , , , const , 。
(3) , , 。 , ; , 。
(4) 。 << >>、 = 、 、 = 、 。