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 B:public A{……};
B b;
A &Ref = b; //
Ref , 。 A , B , Ref 。
、
(1) , , , 。
(2) , , , const , 。
(3) , , 。 , ; , 。
(4) 。 << >>、 = 、 、 = 、 。