c++ 的指標繼承於 c,若要移除指標,勢必造成嚴重的相容性問題。引用有幾方面的用處,但我在 c++ 中引入它的主要目的是為了支援運算子過載。例如:
void f1(const complex* x, const complex* y) // 沒有引用
void f2(const complex& x, const complex& y) // 使用引用
我們在學習c++過程中,會覺得引用是乙個非常簡單好用的東西,但仔細體會會發現它的一些特性不太好捉摸,下面總結下:
我覺得要說清楚這個話題需要對引用有2個方面的理解,乙個是「單純的c++規範」層面的理解,另乙個是各個編譯器廠家如何「實現引用」的層面來理解。
「單純的c++規範」層面:引用是乙個具名變數的別名,這個所有c++書籍上都會介紹的,但這句背後的含義是什麼呢?答案是"引用不是物件"!!!物件是什麼呢?你可能會說:物件就是「new出來的東西」。但嚴格來說應當是:
物件是帶有一些性質的儲存區域,這些性質包括:大小(sizeof),記憶體對齊,生命週期,連線性,型別,名字(new 出來的物件是不具名物件,沒有名字)。在c++中有哪些地方能體現出來「引用不是物件」呢?看**:
int* arr1[10]; //指標陣列,每個位置上放置乙個指向int型別的指標
int& arr2[10]; //error,沒有這種寫法,沒有存放引用的陣列,因為引用不是物件
int& *p = null; //error,沒用指向指標的引用
int && p; //error,沒有指向應用的應用,這裡其實乙個右值引用,p需要用乙個臨時量初始化
這一層面的理解關鍵是知道:引用不是物件。
2. 編譯器如何「實現引用」:編譯器通過「自解引用的常量指標」來實現引用的效果。看**:
int num = 90;
int & r = num;
//等價於
int * const r = # //這也是引用為什麼要初始化的原因
cout《總結:引用需要理解到這兩個層面才能理解一些問題。
c++中為什麼沒有「引用陣列」,「指向引用的指標」,「指向引用的引用」,原因是「引用不是物件」。
2.不是說「引用不是物件嗎?」 為什麼函式傳參時,以及函式的返回值可以引用?(函式也不是物件,因此函式傳參不能傳遞,函式的返回值也不能是函式,實際上傳遞的都是指向函式的指標)。這時應當把引用理解成「引用是乙個const指標」。
對C 引用的理解
c 中引用是個非常重要的概念,引用是在c 中新增的一種復合型別,是已定義的變數的別名。但是這種別名有什麼作用呢?難道只是為了給變數起個綽號?並不是,引用變數的主要作用是用作函式形參,通過使用引用變數作為函式引數,函式將使用原始資料,而不是使用資料的副本,這樣除了指標之外,為函式訪問原始資料提供了另一...
對C 引用的簡單理解
引用是c 中的特殊用法,在c語言中是沒有的,有點類似c語言中指標的一種用法。引用簡單說就是對已經建立的起乙個別名,或者說建立乙個副本,但是它是不分配記憶體的。對引用變數的操作直接改變被引用變數的值,相當於是對位址操作,引用變數不能單獨存在,一定是要有被引用變數的存在,才會有引用變數。例如int a ...
對const和引用的新理解
在c語言中,const實際是乙個冒牌貨,例如,const int a 10 a是乙個唯讀的常量,通過指標可以繞過去 在c 中,通過const 修飾的東西,會變成什麼樣子?1.const int a 10 放入符號表裡,始終從符號表裡拿資料,a變成真正意義上的常量10 keyvaluea10 c 裡面...