C++&(引用)を実践的に学ぶ

2371 ワード

1.第一例:
仮定:
int var1 = 224; //  var1  224      0x12ABCDEF
則以下のCode:
int var2 = var1;   //  var1     var2.
int& var2 = var1;//var2  var1    (var2 var1   ),var1= var2 = 224,var1       ,         0x12ABCDEF

int var2 = &var1; //  , &var1     var1  224   。 (&          )

var 2はvar 1の別名であり、各変数名はメモリ内のブロックデータを表し、var 2はvar 1と同じブロックを表すので、以下のようにする.
var2 = 1104;//   var1    1104

2.第2例:
class Foo

{

public:

    int& setVar1(){return var1;}	//  Foo      var     

    void setVar2(int& t){ var2= t;}	//                 

private:

    int var1;

    int var2;

};



Foo foo;

int i = 224;

int j = 1104;

foo.setVar() = i;   //        ,foo   var1   224

foo.setVar2(j);    //foo   var2   1104.

メソッドsetVar 2を呼び出すと、パラメータtのタイプは参照(int&)であるため、実パラメータを渡す際に実際にはコピーされた動作はない.var 2のタイプはint(int&ではなく)と定義ため、var 2=tは複製に値し、jの値はvar 2に複製する、jの値を修正してもvar 2に影響しない.
3.第3例
class BigSizeClass{//これはメモリ領域を占めるクラスです....};void func1(const BigSizeClass& var);//関数伝達パラメータを呼び出すときは参照で伝達するが、パラメータ伝達はBigSizeClassのインスタンス化オブジェクトvarを一度コピーしてfunc 1()に伝達するのではなく、変数の別名である.void fun2(const BigSizeClass* var);//パラメータが渡されるのは変数を指すアドレスだけで、実パラメータが渡される過程でvarもコピーされません.//ここから,&は*と少し似ており,呼び出し関数がパラメータ伝達されると実パラメータがコピーされず,呼び出し時の時間空間のオーバーヘッドが減少する.
4.第4例
class Foo

{

public:

	Foo(){m_var = 1104;}

	int& var(){return m_var;}

private:

	int  m_var;

};


Foo foo;

foo.var() = 224;		//(1)   foo.m_var     ,  foo.m_var       224.

int i = foo.var();		//(2) i    int ,  int & ,  i          ,   foo.m_var  224         。

int& j = foo.var();		//(3) j     int & ,   foo.m_var   ,  foo.m_var     。

return 0;

5.第5例
class Foo

{

public:

	Foo(){m_var = 0;}

	int fun1(){return m_var;}

	int& fun2(){return m_var;}

private:

	int m_var;

}



int main()

{

	Foo foo;

	int var1 = foo.fun1();	//correct,      

	int& var2 = foo.fun1(); //error,     

	//invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘int’

	int var3 = foo.fun2();		//correct,     1   

	int& var4 = foo.fun2();		//correct,var4 foo.m_var   

     var4 = 4;                       //correct,  foo.m_var=4,

}