引用是c++對c語言的重要擴充,引用就是某一變數的乙個別名,對引用的操作與對變數直接操作完全一樣。指標儲存位址,它的值直接指向在電腦儲存器中某乙個地方的值。由於通過位址可以找到所需的變數單元,因而可以說,位址指向該變數單元。因此,將位址形象化地稱為指標,意思是通過它能找到以它為位址的記憶體單元。
區別:(1)指標有自己的一塊空間,而引用只是乙個別名;
(2)使用sizeof看乙個指標的大小是4,而引用則是被引用物件的大小;
(3)指標可以被初始化為null,而引用必需被初始化且必須是乙個已有物件的引用;
(4)作為引數傳遞時,指標需要被解引用才可以對物件進行操作,而直接對引用的修改都會改變引用所指向的物件;
(5)可以有const指標,但是沒有const引用;
(6)指標在使用中可以指向其它物件,但是引用只能是乙個物件的引用,不能被改變;
(7)指標可以有多級指標,引用只有一級;
(8)指標和引用使用++運算子的意義不一樣;
(9)如果返回動態記憶體分配的物件或者記憶體,必須使用指標,飲用可能引起記憶體洩露。
c++裡的四個智慧型指標是:auto_ptr,shared_ptr,weak_ptr,unique_ptr。
智慧型指標主要用於管理在堆上分配的記憶體,它將普通的指標封裝為乙個棧物件。
智慧型指標的作用是管理乙個指標,因為存在申請的空間在函式結束時忘記釋放,造成記憶體洩漏的情況。使用智慧型指標可以很大程度的避免這個問題,因為智慧型指標就是乙個類,當超出了類的作用域時,類會自動調動析構函式,析構函式會自動釋放資源,所以智慧型指標的作用原理就是在函式結束時自動釋放記憶體空間,不需要手動釋放。
(1)auto_ptr採用所有權模式
auto_ptr p1 (
new string (
"hello world"))
;auto_ptr p2;
p2=p1
此時不會報錯,因為p2剝奪了p1的所有權,但是當程式執行時訪問p1會報錯,所以auto_ptr的缺點是存在潛在的記憶體崩潰問題。
(2)unique_ptr實現獨佔式擁有或嚴格擁有的概念,保證同一時間只有乙個智慧型指標可以指向該物件,它對於避免資源洩露特別有效(例如以new建立物件後因為發生異常而忘記呼叫delete)。
unique_ptr p1 (
new string (
"hello world"))
;unique_ptr p2;
p2=p1
此時會報錯,編譯器認為p2=p1非法,避免了p1不再指向有效資料的問題。因此unique_ptr比auto_ptr更安全。另外,當程式試圖將乙個unique_ptr賦值給另乙個時,如果源unique_ptr是乙個臨時右值,編譯器允許這麼做;如果源unique_ptr將存在一段時間,編譯器禁止這麼做。
unique_ptr p1;
p1=unique_ptr
(new string (
"hello world"
))
這種情況是允許的,因為它呼叫unique_ptr 的建構函式,該建構函式建立的臨時物件在其所有權讓給p1後就會被銷毀。
如果確實想賦值,c++有乙個標準庫函式std::move(),例如
unique_ptr p1,p2;
p1=demo (
"hello");
p2=move (p1)
;p1=demo (
"world"
);
(3)shared_ptr實現共享式擁有概念。多個智慧型指標可以指向相同物件,該物件和其相關資源會在「最後乙個引用被銷毀」的時候釋放。它使用計數機制來表明資源被幾個指標共享,可以通過成員函式use_count()來檢視資源的所有者個數。除了可以通過new來構造,還可以通過傳入quto_ptr,unique_ptr,weak_ptr來構造。當我們呼叫release()時,當前指標會釋放資源所有權,計數減1。當計數等於0時,資源會被釋放。
shared_ptr是為了解決auto_ptr在物件所有權上的侷限性。成員函式如下:
● use_count返回引用計數的個數
● unique返回是否是獨佔所有權(use_count為1)
● swap交換兩個shared_ptr物件
● reset放棄內部物件的所有權或擁有物件的變更,會引起原有物件的引用計數的減少
● get返回內部物件(指標),和直接使用物件是一樣的。如shared_ptr p(new int(1)); p和p.get()是等價的。
(4)weak_ptr是一種不控制物件生命週期的智慧型指標,它指向乙個shared_ptr管理的物件。
C 面試準備日記 static
1 從設計思想上看,c 是物件導向的語言,c是面向過程的結構化程式設計。2 從語法上看,c 具有封裝 繼承 多型三種特性 c 增加了許多態別安全功能,比如強制型別轉換 c 支援正規化程式設計,比如模板類 函式模板等。定義全域性靜態變數 區域性靜態變數 靜態函式 類的靜態成員 類的靜態函式。1 全域性...
C 面試準備日記1 redis
redis是乙個開源的 基於記憶體的 key value資料庫,並提供多種語言的api。redis是乙個儲存系統,它指出儲存的value型別相對多,包括string list 鍊錶 set 集合 zset 有序集合 這些資料型別都支援push pop add remove等操作。redis為了保證效...
準備面試一
這次金蝶的面試爭取到了幾天的準備時間,順帶一句上次一公司通知叫她發郵件答應了沒發,這樣的公司不去也罷。面試我是這樣理解的,全力以赴,深入 準備,以成功為導向的經歷才有用,才能叫經驗。不能為失敗為目的,消極應對。自信自然出色。真誠贏得成功。前天看了常考的sql語句題目,昨天看了oracle調優,今天大...