別名的定義 傳遞 返回物件

2022-08-09 00:15:15 字數 2823 閱讀 6550

&的功能:

(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...