C 基礎之引用與typedef

2021-08-26 02:55:44 字數 2475 閱讀 3299

引用

1. 初識引用

引用就是物件的另乙個名字。在實際程式中,引用主要用作函式的形式引數。我們將在後面再詳細介紹引用引數。

引用是一種復合型別,通過在變數名前新增「&」符號來定義。復合型別是指用其他型別定義的型別。在引用的情況下,每一種引用型別都「關聯到」某一其他型別。不能定義引用型別的引用,但可以定義任何其他型別的引用。

引用必須用與該引用同型別的物件初始化:

int ival = 1024;

int &refval = ival; // 正確

int &refval2; // 錯誤:引用必須初始化

int &refval3 = 10; // 錯誤:引用必須引用同型別的物件

引用只是別名,作用在引用上的所有操作事實上都是作用在該引用繫結的物件上:

refval +=2;            //將 refval 指向的物件 ival 加 2
類似地,

int i = refval;         //把和 ival 相關聯的值賦給 i
tips:當引用初始化後,只要該引用存在,它就保持繫結到初始化時指向的物件。不可能將引用繫結到另乙個物件。

2.const 引用

const 引用是指向 const 物件的引用:

const

int ival = 1024;

const

int &refval = ival; // 正確

int &ref2 = ival; // 錯誤,不能使用非const引用乙個const物件

可以讀取但不能修改 refval ,因此,任何對 refval 的賦值都是不合法的。這個限制有其意義:不能直接對 ival 賦值,因此不能通過使用 refval 來修改 ival。

同理,用 ival 初始化 ref2 也是不合法的:ref2 是普通的非 const 引用,因此可以用來修改 ref2 指向的物件的值。通過 ref2 對 ival 賦值會導致修改 const 物件的值。為阻止這樣的修改,需要規定將普通的引用繫結到 const 物件是不合法的。

tips:

const 引用可以初始化為不同型別的物件或者初始化為右值,如字面值常量:

int i = 42;

const

int &r = 42;

const

int &r2 = r + i;

同樣的初始化對於非 const 引用卻是不合法的,而且會導致編譯時錯誤。

觀察將引用繫結到不同的型別時所發生的事情,最容易理解上述行為。假如我們編寫

double dval = 3.14;

const

int &ri = dval;

編譯器會把這些**轉換成如以下形式的編碼:

int temp = dval;            // 建立乙個臨時變數temp接收dval

const

int &ri = temp; // 將ri與temp繫結

如果 ri 不是 const,那麼可以給 ri 賦一新值。這樣做不會修改 dval,而是修改了 temp。期望對 ri 的賦值會修改 dval 的程式設計師會發現 dval 並沒有被修改。僅允許 const 引用繫結到需要臨時使用的值完全避免了這個問題,因為 const 引用是唯讀的。

非 const 引用只能繫結到與該引用同型別的物件。const 引用則可以繫結到不同但相關的型別的物件或繫結到右值。

typedef

typedef 可以用來定義型別的同義詞:

typedef

double wages; // wages是double的同義詞

typedef

int exam_score; // exam_score 是int的同義詞

typedef wages salary; // salary是double的同義詞

typedef 名字可以用作型別說明符:

wages hourly, weekly;   // double hourly, weekly;

exam_score test_result; // int test_result;

tips:

typedef 定義以關鍵字 typedef 開始,後面是資料型別和識別符號。識別符號或型別名並沒有引入新的型別,而只是現有資料型別的同義詞。typedef 名字可出現在程式中型別名可出現的任何位置。

typedef 通常被用於以下三種目的:

為了隱藏特定型別的實現,強調使用型別的目的。

簡化複雜的型別定義,使其更易理解。

允許一種型別用於多個目的,同時使得每次使用該型別的目的明確。

C 引用與指標基礎

本節 的引用為左值引用 引用為物件起了個別名,引用型別引用另外一種型別,通過將宣告符寫成 d的形式來定義引用型別,其中d是宣告的變數名。其中引用必須初始化,因為定義引用時,程式把引用和它的初始值繫結到一起,而不是將初始值拷貝給引用,一旦初始化完成,引用將和它的初始值物件一直繫結到一起 int iva...

C指標之函式指標與typedef

函式指標 陣列指標 普通指標之間並沒有本質區別,區別在於指標指向的東西是個什麼玩意。函式的實質是一段 這一段 在記憶體中是連續分布的 乙個函式的大括號括起來的所有語句將來編譯出來生成的可執行程式是連續的 結合函式的實質,函式指標其實就是乙個普通變數,這個普通變數的型別是函式指標變數型別,它的值就是某...

C 之引用與符號「 」

一 的意思 1.取位址符,這時候它用於資料的前面,比如int a b 2.c 裡還使用 作為引用符,如果你確認程式是標準的c而非c 的話,那麼可以排除是引用了。引用也用於資料前面,它只在定義和宣告時使用,如int othername name int a b 定義時使用在等號左側,是引用。相當於a是...