&的功能:
(1)取位址符
(2)引用符
一、定義別名
定義變數的別名
如,int n ;
int &m =n; //m是n 的別名 ,可以用int型別的m來表示int型別的n。且m與n的位址也一樣。故m 和 n 是同乙個東西!
定義物件的別名
如:human mike;
human &rmike = mike; //rmike是mike的別名
二、空引用
指標進行刪除之後,需要將它賦值為空,引用卻不需要這樣做。假如該物件存放在棧中,那麼在物件超出作用域時別名會和物件一起消失;假如存放在堆中,由於對中記憶體只能通過指標來訪問,因此用不著別名,即使再定義乙個蓋子真的別名,那麼將指標刪除並賦空之後,該指標的別名中的位址也相應的賦空了。
三、按別名傳遞
傳遞數值包括:按值傳遞,按址傳遞,按別名傳遞
關於變數:(1)按值傳遞
#include using namespace std;void swap(int a,int b)
int main()
int main()
int main()
a(a&)
~a()
};a fun(a one)
int main()
/***********************
輸出:執行建構函式建立乙個物件 //1
執行複製函式建立該物件的副本 //2
執行複製函式建立該物件的副本 //3
執行析構函式刪除該物件
執行析構函式刪除該物件
執行析構函式刪除該物件
*/
按值傳遞在向函式傳遞乙個物件時,會向傳遞變數那樣建立乙個該物件的拷貝,而從函式返回乙個物件時,也要建立這個被返回的物件的乙個拷貝!這就導致了,當物件所佔記憶體空間很大的時候,在傳遞過程中每次都要複製乙個,雖然當值返回給呼叫程式之後會刪除該物件的複製品,也會浪費巨大的空間!!!
因此,可以將程式改成按址傳遞:
#include using namespace std;class a
a(a&)
~a()
};a* fun(a *one)
int main()
/**************************
輸出:執行建構函式建立乙個物件
執行析構函式刪除該物件
****************************/
但是問題來了:使用了指標去指向物件,那不是指標也可以修改物件啦!!要是它不小心用於非法怎麼辦?我們來用const避免他:
#include using namespace std;class a
a(a&)
~a()
};const *const a fun(const a *const one) //保證傳遞進來的資料不被修改,又保證了返回的資料不被修改
int main()
或者用別名傳遞
#include using namespace std;class a
a(a&)
~a()
};const *const a fun(const a & one) //保證傳遞進來的資料不被修改,又保證了返回的資料不被修改
int main()
此方法將函式的返回值和接收引數都定義為const,就可以保證函式內不可修改原始值,同時避免利用返回值對原始值進行修改。
使用指標還是使用別名呢?
(1)指標可以為空,但引用不能為空,指標可以被賦值,但引用只可以被初始化,不可被復位另乙個物件的別名。如果需要使乙個變數記錄不同物件的位址,必須用指標!
(2)在堆中建立一塊記憶體區域,必須要用指標才能指向該塊區域!當然我們也可以用引用來引用指向記憶體空間的指標(沒必要!!)...
如: int * &a =new int;
*r = 3;
這樣的寫法容易出錯!!當機器虛擬記憶體太小,無法建立新空間的情況下,那麼new int會自動返回乙個空指標。 因此會導致乙個無用 的別名。而使用 '*' 讀取乙個無用的別名則會引起系統奔潰!!
--->解決辦法是,不要將引用初始化為新建記憶體區域的別名,而是要將 a 初始化為指向該區域的指標的別名。前提是首先判斷該指標不為空。更多的時候,一般不給指標建立別名。
四、按別名返回堆中物件
需要改變物件中的資料時:
#include using namespace std;
class a
a(a&)
~a()
void set(int i)
int get()
private:
int x;
};a& fun(a&a) //返回值是a物件的別名
int main()
{ a *p = new a(99); //堆中建立了乙個追蹤物件a(99),用p指向它
fun(*p); //將這個追蹤物件傳遞進去
cout<< p->get()《解決了空引用問題.
mybatis的定義別名
在parametertype和resulttype設定時,為了方便編碼,定義別名代替 pojo 的全路徑。框架預設支援別名 int,string。定義別名兩種方式 定義別名的位置是在全域性的配置檔案sqlmapconfig.xml中定義 注意 定義別名要放在全域性配置檔案的上面部分,放在下面部分會報...
C C 如何傳遞和返回結構 物件
最近被python的變數引用搞的很頭疼 所以用c 做了實驗 只傳遞結構 include class point void print point x intmain int argc,const char ar 輸出 0x000 0x7ffe00000001 132766只返回結構 include ...
yii別名的定義和別名的獲取以及別名的使用
1.別名的定義規則 別名用來表示檔案路徑和 url,這樣就避免了在 中硬編碼一些絕對路徑和 url。乙個別名必須以 字元開頭,以區別於傳統的檔案路徑和 url。沒有前導 定義的別名將以 字元作為字首。在配置檔案中定義別名 2.配置檔案main local.php中定義 aliases linchen...