C++&(引用)を実践的に学ぶ
2371 ワード
1.第一例:
仮定:
var 2はvar 1の別名であり、各変数名はメモリ内のブロックデータを表し、var 2はvar 1と同じブロックを表すので、以下のようにする.
2.第2例:
メソッド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例
5.第5例
仮定:
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,
}