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的位址。 (&在這裡是取位址的意思)
var2是var1的別名的意思是,每個變數名代表著記憶體中的乙個塊資料,而var2與var1代表的是同一塊,所以下面:
var2 = 1104;//此後 var1 也等於1104
2.第2個例子:
class foo
//返回foo類的成員變數var的乙個別名
void setvar2(int& 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.
在呼叫方法setvar2時,由於形參t的型別是引用(int&),所以傳遞實參時實際上沒有複製的動作。因為var2的型別定義為int(而不是int&) ,所以var2= t發生了一次值得複製,j的值被複製給var2,修改j的值不會影響var2.
3.第3個例子
class bigsizeclass
; void func1(const bigsizeclass& var); //呼叫函式傳遞引數時是以引用方式傳遞,引數傳遞的只是變數的別名,而不是將bigsizeclass的例項化物件var複製一次,再傳遞給func1().
void fun2(const bigsizeclass* var); //引數傳遞的只是指向變數的位址,實參傳遞的過程中,var也未被複製。
//從這裡看,& 與 *有點相似,在呼叫函式進行引數傳遞時,實參都沒有發生複製,減少了呼叫時的時間空間的開銷。
4.第4個例子
class foo
int& 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
int fun1()
int& fun2()
private:
int m_var;
}int main()
以引用的方式傳遞引數避免物件切割
當乙個子類物件以傳值的方式傳遞並被視為乙個基類物件,基類的copy建構函式會被呼叫,而造成 此物件的行為像個子類物件 的那些性質被完全切割掉,僅留下乙個基類物件。例如 class window class windowwithscrollbars public window 現在假設你希望寫個函式列...
c 學習 命名空間(巢狀 引用方式)
通過 理解 using system using system.collections.generic using system.linq using system.text using system.threading.tasks using space2 using s using s.ss u...
技術學習 以實踐為導向
最近和同學討論了一些學習技術的問題,感覺很多人如果想學習某樣技術會立馬查一些經典的書籍然後抱著它慢慢地啃,然後心裡給自己暗示 只要啃完這本書就一定能成為 技術牛人了,可是真的是這樣嗎?我本科的時候也曾經這樣做過,可是沒有一本書是真正看完的,因為這些書往往都是非常的厚動輒700多頁,看到最後就沒動力了...