一.深拷貝和淺拷貝?
淺拷貝是指源物件與拷貝物件共用乙份實體,僅僅是引用的變數不同(僅僅是名稱不同),對其中任何乙個物件的改動都會影響另外乙個物件,例如:乙個人叫小王,後來改名小李,結果不管是小王死了還是小李死了,都是這個人死了
深拷貝:源物件與拷貝物件獨立,其中任何乙個物件的改動都不會對另外乙個物件造成影響,舉個例子:乙個人叫張三,但是後來他轉殖了乙個人叫李四,那麼張三和李四的死就沒有關係了。比較典型的是值物件:int,double,struct,enum
為什麼區分:類中預設建構函式是淺拷貝,一般情況下,預設建構函式也就是淺拷貝是可以滿足基本需求的,但是,當出現動態成員的時候,乙個類的析構函式會將記憶體釋放掉,這時候另乙個類的指標就變成了野指標,所以應該使用自己編寫的拷貝建構函式進行為新物件分配空間,這就變成了深度拷貝,因為不在共用乙個記憶體(例項)了。
二。引用和指標的區別?
1.引用只是乙個別名,指標是位址
2.指標可以在執行時改變其所指向的位址,但是引用一旦和物件繫結就不能再改變
3.從記憶體看,指標會分配記憶體區域,而引用不會,他僅僅是乙個別名
4.引數傳遞時,飲用會做型別檢查,指標不會
5.引用不能為空,指標可以為空
三。const和define有什麼區別
1.define只是字串替換,const參與編譯執行
2.define不會做型別檢查,const擁有型別,會執行相應的檢查
3.define僅僅是巨集替換,不占用記憶體,const會占用記憶體
4.const記憶體效率高,編譯器通常會將const變數儲存到符號表中,而不會分配儲存空間,這使得它成為乙個編譯期間的常量,沒有儲存和讀取的操作
四。define和inline的區別?
1.define只是字串替換,inline由編譯器控制
2.define只是簡單地巨集替換,通常會產生二義性,而inline會真正地編譯到**中
3.inline是否展開由編譯器決定,有時候當函式太大時,編譯器可能選擇不展開相應的函式
五。malloc和new的區別?
1.malloc/free是標準庫函式,new/delete是c++運算子,都可以用於動態記憶體的申請和釋放
2.對於基本型別來說,他們沒有什麼區別,但是對於非內部物件(如類)而言,物件在建立和銷毀的時候要進行構造和析構,但是malloc/free而言,他們是庫函式而不是運算子,所以不在編譯器的許可權內,所以不能把構造析構函式的任務強加於malloc/free
3.所以c++增加了new/delete函式,new負責建立和初始化物件,delete負責清理和釋放記憶體,new和delete是運算子
4.c++程式呼叫c函式,而c程式只能使用malloc/free管理動態記憶體,c++則兩者都可以
5.new可以認為是malloc加行建構函式,delete是free加上析構函式。new出來的指標是帶有型別的,malloc指標都是void指標
c 基礎五個題(三)
一。乙個物件訪問普通函式和虛函式的時候,哪乙個更快?訪問普通函式更快,因為普通成員函式在編譯階段已經被確定,因此在訪問時直接呼叫對應位址的函式,而虛函式在呼叫時,需要首先在虛函式表中查詢虛函式所在的位址,因此比普通函式要慢一些。二。什麼情況之下,需要析構函式是虛函式?首先存在類繼承並且析構函式確實析...
C語言基礎訓練題 五
實現乙個函式,列印乘法口訣表,口訣表的行數和列數自己指定,輸入9,輸出99口訣表,輸入12,輸出1212的乘法口訣表。使用函式實現兩個數的交換。實現乙個函式判斷year是不是閏年。建立乙個陣列,實現函式init 初始化陣列 實現empty 清空陣列 實現reverse 函式完成陣列元素的逆置。要求 ...
五個遞迴題總結
當然,很多遞迴都是可以優化的,比如f n f n 1 f n 2 這裡f n 2 就會計算兩次,可以用雜湊表儲存已經計算的資料,但是這裡主要演示遞迴思想,不再進行優化。週末你帶著女朋友去電影院,女朋友問你,咱們現在坐在第幾排啊,電影院太黑沒法數怎麼辦,於是你問前一排的人他是第幾排,你只需要在他的數字...