引用型別的使用注意

2021-04-08 18:46:41 字數 857 閱讀 4099

引用型別由型別識別符號和乙個取位址操作符來定義, 引用必須被初始化.

請看下面的初始化:

double dval = 3.14159;

extern int f();

int  &ir1 = 1024;  // error

int &ir2 = dval;     // error

int &ir3 = f();         // error

上面的三個引用初始化都將導致編譯出錯. 下面做適當解釋.

實際上, 引用在內部存放的是乙個物件的位址, 它是該物件的別名, 對於不可定址的值, 比如文字常量, 以及不同型別的物件, 編譯器為了實現引用, 必須生成乙個臨時物件, 引用實際上指向該物件, 但使用者不能訪問它. 比如, 我們寫了:

double dval = 3.14159;

int &ir2 = dval;

由於需要型別轉換, 因此編譯器將其轉換成:

int temp = dval;   int &ir2 = temp; // 如果這時候給ir2賦乙個新值, 那麼改變的是temp, 而不是dval.

// 而temp是不可定址的. 同時 對於使用者來說, 並不想這麼做.

因此, 這種情況下, 我們需要const引用, 因為它們是唯讀的, 不允許非const引用指向需要臨時物件的物件或值. 另外, 對於int &ir3 = f(), f()函式呼叫的返回值也是乙個臨時值, 不能被用來初始化非const型的引用.

正確的修改如下:

const int  &ir1 = 1024;  // ok

const int &ir2 = dval;     // ok

const int &ir3 = f();         // ok

C 8 0可空引用型別的使用注意要點

c 8.0可空引用型別的使用注意要點 最近vs2019正式版發布了,裝下來順便試用了一下c 8.0,最大的看點應該就是可空引用型別了。不過c 8.0仍然處於beta的狀態,而且試用時也遇到了幾個坑。背景知識說明 所謂的可空引用型別是指,一旦啟用了可空引用型別這個新特徵,引用型別將預設被視為不可空,無...

C 8 0可空引用型別的使用注意記錄

前言 最近vs2019正式版發布了,裝下來順便試用了一下c 8.0,最大的看點應該就是可空引用型別了。不過c 8.0仍然處於beta的狀態,而且試用時也遇到了幾個坑。背景知識說明 所謂的可空引用型別是指,一旦啟用了可空引用型別這個新特徵,引用型別將預設被視為不可空,無法賦予null,除非手工將它設為...

C 值型別 引用型別及ref out的使用

1.值型別 c 的所有值型別均隱式派生自system.valuetype 結構體 struct 直接派生於system.valuetype 數值型別 整型 sbyte system.sbyte的別名 short system.int16 int system.int32 long system.in...