引用型別由型別識別符號和乙個取位址操作符來定義, 引用必須被初始化.
請看下面的初始化:
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...