復合型別之一 引用

2022-09-03 02:09:08 字數 1634 閱讀 7692

總:復合型別

1.1.引用(reference)

c++11中新增了一種引用:所謂的「右值引用」,主要用於內建型別,嚴格來說,當我們使用術語「引用」時,指的其實是「左值」引用。

引用是為物件起了另外乙個名字,引用型別引用另外一種型別。假設d是宣告的變數名:

int ival = 1024; 

int &refval = ival;      //refval 指向 ival (是 ival的另外乙個名字);

int &refval2;             //絕對錯誤,引用必須要初始化;

關於為什麼必須初始化:一般在初始化變數時,初始值會被拷貝到新建德爾物件中。然而定義引用時,程式把引用和它的初始值繫結在一起,而不是把初始值拷貝給引用,一旦初始化完成,引用將和它的初始值物件一直繫結在一起。因為無法令引用重新繫結到另外乙個物件,因此引用必須初始化。

引用即別名:

引用並非物件,相反的,它只是乙個已經存在的物件所起的另外乙個名字。定義了引用之後,對其進行的所有操作都是在與之繫結的物件上進行的:

int ival = 1024; 

int &refval = ival;      //refval 指向 ival (是 ival的另外乙個名字);

refval = 2;                //把2賦給refval 指向的物件,此處就是賦給了ival;

int ii = refval;            //這和 ii = ival 等價;

為引用賦值,實際就是把值賦給了與引用繫結的物件。獲取引用的值,實際是獲取了與引用繫結的物件的值。同理,以引用作為初始值,實際上是以引用繫結的物件作為初始值。

引用本身不是物件,所以一定不能定義引用的引用;

引用的定義:

允許在一條語句中定義多個引用,其中每個引用都必須以&開頭,引用只能繫結在物件上,而不能與字面值或者哪個表示式的結果繫結在一起:

int &refval4 = 10;               //錯誤,引用型別的初始值必須是乙個物件

double dval = 3.14;

int &refval = dval;          //錯啦,對應起來,這裡引用的型別的初始值必須是 int 型

一般情況下:所有引用的型別都要和與之繫結的物件嚴格匹配。但是,不一般的情況下,有兩種例外:

例外一:

在初始化常量引用時,允許任意表示式作為初始值,只要該表示式的結果能轉換成引用的型別即可;尤其是允許為乙個常量引用繫結非常量的物件、字面值,甚至是乙個一般表示式:

int i = 12;

const int &r1 = i;      //允許將 const int & 繫結到乙個普通int 物件上;

const int &r2 = 12;  //正確:r1 是乙個常量引用;

const int &r3 = r1*2; // 正確:r3 是乙個常量引用;

int & r4 = r1*2;      //錯誤:r4只是乙個普通的非常量引用;

當 double dval = 3.14;

const int& ri = dval; 發生了如下的轉換:

const int temp = dval;

const int& ri = temp;

例外二:

存在繼承關係的類:此處見後來博文:

售前考題之一 引用

原來題目如下 題目 說北京某家樂福地下超市老闆問你乙個問題,他說 我們家樂福,每天有許多人進進出出,每天的營業額在200來萬,你知道嗎,我問你乙個問題,除了看每天的財務報表以外,你如何計算我每天的營業額,我可以告訴你,平均每個顧客的購物在95元,每天營業時間為12小時,這個平均是2個月以來的平均數,...

5 0 引用型別

ecmascript中有5中簡單資料型別 也叫基本資料型別 undefined boolean null number string。還有一種複雜資料型別 object object本質上是一組無序的明值対組成的 1 應用型別的值 物件 是引用型別的乙個例項。2 在es種,引用型別是一種資料結構,用...

C Primer學習之一引用和指標

引用是一種復合型別,引用分為左值引用和右值引用,其中右值引用時c 11提出來的,常說的引用其意為左值引用。注意 引用不是物件,它是乙個物件 變數 的別名,不能改變引用的物件,故必須在初始化的確定引用的物件。引用的型別必須和被引用變數的型別一致,但有兩種例外情況。const引用 double dval...