在c++中指針是否能夠被完全替代?甚至是不使用指針?
上次面試被問傻了,說不考慮性能的情況下指針還有必要存在嗎
在允許你使用STL的前提下,如果不考慮性能,指針當然是完全可以不直接使用的。在一些極端情況下,你可以用union來代替reinterpret_cast。
如果連STL都不給用,那至少要給類似delphi的string類型和array類型,不然這語言就不圖靈完備了。
完全不使用指針不可能。
- 盡量少用new,delete,野指針;多用RAII的類,如smart pointer,containers (vector,list 等)。現代C++,對一般寫application,完全可以做到,不用考慮手動清理內存。
- 對於庫作者,特殊情況下低層次數據結構,還是要用到野指針的。不能用指針你為什麼不用java……
不能
不是可以用引用么。。。不過引用明顯是不能適用於所有指針情況的只要定址內存獲得數據這種架構還存在指向內存並獲得其地址也是一種實實在在的需求你可以簡化這種需求,比如說動態回收,這樣就不用手動釋放了(相應的,效率可能會發生問題)
但是在現有計算機系統不變的情況下,這種需求是會一直存在的
完全不存在指針是不可能的,一般說的最佳實踐是業務邏輯里不顯式出現原生指針
基礎數據結構,例如鏈表和動態數組,如何實現?
實際上是反過來的:一般的編程幾乎不會直接用到指針,但是指針在C++的上下文里沒辦法被替代。
C++用引用、智能指針、迭代器把指針邏輯隱藏得還算好,所以只要你不是寫太底層得東西,是不太可能需要直接操作指針的。然而,智能指針和一部分迭代器說到底還是用指針實現的啊。
從另一個角度說,真的取消指針,指針的各種功能歸位。改動巨大不說,誰能保證不會有一天冒出一個現有上層抽象搞不定的東西?所以指針還得留著,既然留著,能用的時候還接著用就是了。反正有上層抽象,不會惹什麼大麻煩。如果是表面上看不出指針是可以的。你可以把指針封裝起來。但是完全不用指針是基本不可能的。
我想,面試官想問的是:在完全不考慮效率的情況下,是否可以完全避免使用raw pointer
答:可以
上面說到的雙鏈表的情況,可以用weak_ptr處理
-----------------
不過,實際上,即使是modern C++也是在很多情況下,推薦你使用raw pointer的。
重點在於不要使用raw pointer擁有一個對象(資源)。資源的擁有權,應該使用unique_ptr/shared_ptr
普通的類似
void print(char * str) {
...
}
raw pointer 依然是個好的選擇
Modern C++:不要使用raw pointer擁有對象,不要使用new/delete
指針就是內存這個大數組的下標嘛。實現普通的數據結構用自己開的數組和下標完全是可以的。不過動態內存分配之類和系統交互的場合得用指針,以及普通的數據結構用數組下標會影響效率。
這樣說吧,引用和指針的唯一本質區別在於:如果你只用引用不用指針,是無法產生類似空指針一樣的空引用的。
那麼可不可以全部把指針幹掉來消滅空指針錯誤呢?原來就有寫rust的擁護者這樣給我推銷說rust不會出空指針錯。
不可能。
兩個對象A,B互相通過成員引用對方。然而初始化卻總是一先一後的。B還沒有初始化的時候,A能(在自己的初始化過程中)引用他嗎?且不說B和A是否一定在一個上下文初始化,即使在一個上下文內初始化,A去引用了未初始化的B,這也不過是把空指針問題變成了更加危險的野指針。
如果你認為我上面說的例子是很罕見的認為我在雞蛋裡挑骨頭,那我告訴你一個例子:雙向鏈表中鄰接的2個節點。
沒了指針我為什麼還要用C艹
C/C++的精髓:如果沒有指針做函數參數,就沒有介面的封裝與設計,沒有介面的封裝與設計,就沒有軟體模塊的劃分,沒有軟體模塊的劃分,哪來的軟體?哪來的系統信息?指針就像金錢一樣,雖不是萬能的,但是沒有它是萬萬不能的!
不使用指針最大的問題是沒辦法使用堆內存(heap),而棧內存是很有限的。
在不考慮性能的情況下,理論上完全不使用指針是可行的,整個程序需要一個或多個全局的 struct,任何函數修改這些 struct 都必須拷貝,所有函數的參數和返回值都必須拷貝,代碼會變得非常啰嗦。不用 raw ptr 是可以的
數組用 std::array 或者 std::vector。
對象用智能指針然後放堆上。
但如果你說不用一切類似指針的東西,GG。沒有指針很多情況做不了,靈活性等方面也不會太好。簡單至極的軟體比如求a+b可以完全不用指針
不知道你說的是 不使用指針原理(地址間接訪問),還是單單不使用指針但可以使用其他形式的地址引用方式。比如引用,數組,甚至函數調用,本質上都是指針傳遞。
如果是前者,不可能。你能不調用內置函數(甚至操作系統的api)來在顯示器上顯示內容?而且更沒有必要。指針(引用)保證了同一塊內存的高效復用。
後者的話。只是不使用指針本身這個語法,完全可以。你看Python和Java不就沒有了么不能。。。
指針就是地址 你直接操作地址應該可以不用指針。
推薦閱讀:
※C++ 是 2012 年不宜進入的技術點嗎?
※c++虛函數表在運行時候是如何存在的?
※cocos2dx開發遊戲,如果可以使用C++做出來,是不是不用lua,全用C++做更好呢?
※C++中this指針藏在哪裡?
※一個類有幾個this指針?如果只有一個,那是怎麼區分不同的對象呢?
TAG:C |