日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C/C++基础知识点(二)

發(fā)布時(shí)間:2025/1/21 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++基础知识点(二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • 13.C++如何定義常量,常量放在內(nèi)存的哪個(gè)位置?
        • 14.const修飾成員函數(shù)的目的是什么?
        • 15.以下幾行代碼的區(qū)別?
        • 16.隱式類型轉(zhuǎn)換
        • 17.new/delete與malloc/free的區(qū)別
        • 18. RTTI
        • 19.C++如何處理返回值
        • 20.C++中拷貝賦值函數(shù)的形參能否進(jìn)行值傳遞?
        • 21.STL有什么基本組成
        • 22.STL中set和map如何實(shí)現(xiàn)的?
        • 23.STL迭代器如何刪除元素
        • 24.vector和list的區(qū)別

13.C++如何定義常量,常量放在內(nèi)存的哪個(gè)位置?

常量在C++里的定義是一個(gè)top-level const加上對(duì)象類型,常量定義必須初始化。對(duì)于局部對(duì)象,常量存放在棧區(qū),對(duì)于全局對(duì)象,常量存放在全局/靜態(tài)存儲(chǔ)區(qū)。對(duì)于字面值常量,常量存放在常量存儲(chǔ)區(qū)。

14.const修飾成員函數(shù)的目的是什么?

const修飾成員函數(shù)標(biāo)明函數(shù)調(diào)用不會(huì)對(duì)對(duì)象作出任何更改,事實(shí)上,如果確認(rèn)不會(huì)對(duì)對(duì)象做更改,就應(yīng)該為函數(shù)加上const限定,這樣無(wú)論const對(duì)象還是普通對(duì)象都可以調(diào)用該函數(shù)。

15.以下幾行代碼的區(qū)別?

const char * arr = "123"; //字符串123保存在常量區(qū),const本身修飾arr指向的值不能通過(guò)arr去修改,但是字符串"123"在常量區(qū),本來(lái)就不能修改,所以加不加const都一樣的。
char * brr = "123"; //字符串"123"保存在常量區(qū),這個(gè)arr指針指向的是同一個(gè)位置,同樣不能用brr去修改"123"的值。
const char crr[] = "123"; //這里123本來(lái)是在棧上的,但是編譯器可能會(huì)做某些優(yōu)化,將其放到常量區(qū)。
char drr[] = "123";//字符串123保存在棧區(qū),可以通過(guò)drr去修改。

16.隱式類型轉(zhuǎn)換

首先,對(duì)于內(nèi)置類型,低精度的變量給高精度變量賦值會(huì)發(fā)生隱式類型轉(zhuǎn)換,其次,對(duì)于只存在單個(gè)參數(shù)的構(gòu)造函數(shù)的對(duì)象構(gòu)造來(lái)說(shuō),函數(shù)調(diào)用可以直接使用該參數(shù)傳入,編譯器會(huì)自動(dòng)調(diào)用其構(gòu)造函數(shù)生成臨時(shí)對(duì)象。

17.new/delete與malloc/free的區(qū)別

首先,new/delete是C++的關(guān)鍵字,而malloc/free是C語(yǔ)言的庫(kù)函數(shù),后者使用必須指明申請(qǐng)內(nèi)存空間的大小,對(duì)于類類型的對(duì)象,后者不會(huì)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。

18. RTTI

RTTI 全稱:運(yùn)行時(shí)類型檢查。在C++層面主要體現(xiàn)在dynamic_cast和typeid,VS中虛函數(shù)表的-1位置存放了指向type_info的指針,對(duì)于存在虛函數(shù)的類型,typeid和dynamic_cast都會(huì)去查詢type_info.

關(guān)于RTTI詳細(xì)介紹請(qǐng)查看這里

19.C++如何處理返回值

生成一個(gè)臨時(shí)變量,把它的引用作為函數(shù)參數(shù)傳入函數(shù)內(nèi)。

20.C++中拷貝賦值函數(shù)的形參能否進(jìn)行值傳遞?

不能。如果是這種情況下,調(diào)用拷貝構(gòu)造函數(shù)的時(shí)候,首先要將實(shí)參傳遞給形參,這個(gè)傳遞的時(shí)候又要調(diào)用拷貝構(gòu)造函數(shù),如此循環(huán),無(wú)法完成拷貝,棧也會(huì)滿。

21.STL有什么基本組成

STL主要由以下幾個(gè)部分組成:容器、迭代器、仿函數(shù)、算法、分配器、配接器。
它們之間的關(guān)系:分配器給容器分配存儲(chǔ)空間,算法通過(guò)迭代器獲取容器中的內(nèi)容,仿函數(shù)可以協(xié)助算法完成各種操作,配接器用來(lái)套接適配仿函數(shù)。

22.STL中set和map如何實(shí)現(xiàn)的?

  • set:集合。所有元素都會(huì)根據(jù)元素的值自動(dòng)被排序,且不允許重復(fù)。底層實(shí)現(xiàn):紅黑樹。
    set底層是通過(guò)紅黑樹(RB-tree)來(lái)實(shí)現(xiàn)的,由于紅黑樹是一種平衡二叉搜索樹,自動(dòng)排序的效果很不錯(cuò),set以此為底層機(jī)制。并且set的所有操作接口,都是轉(zhuǎn)調(diào)用RB-tree的操作。
    適用場(chǎng)景:有序不重復(fù)集合。
  • map:映射。map的所有元素都是pair,同時(shí)擁有鍵值key和實(shí)值value,pair的第一元素被視為鍵值,第二元素被視為實(shí)值,所有元素都會(huì)根據(jù)元素的鍵值自動(dòng)被排序。不允許鍵值重復(fù)。底層實(shí)現(xiàn)用紅黑樹。
    適用場(chǎng)景:有序鍵值對(duì)不重復(fù)映射。

23.STL迭代器如何刪除元素

1.對(duì)于序列容器vector,deque來(lái)說(shuō),適用erase(itertor)后,后邊的每個(gè)元素的迭代器都會(huì)失效,后邊的每個(gè)元素都會(huì)往前移動(dòng)一個(gè)位置,但是erase會(huì)返回下一個(gè)有效的迭代器。

2.對(duì)于關(guān)聯(lián)容器map,set來(lái)說(shuō),適用了erase(itertor)后,當(dāng)前元素的迭代器失效,但是其結(jié)構(gòu)是紅黑樹,刪除當(dāng)前元素的,不會(huì)影響到下一個(gè)元素的迭代器,所以在調(diào)用erase之前,記錄下一個(gè)元素的迭代器即可。

3.對(duì)于list來(lái)說(shuō),它使用了不連續(xù)分配的內(nèi)存,并且它的erase方法也會(huì)返回下一個(gè)有效的itertor,因此上面兩種正確的方法都可以使用。

24.vector和list的區(qū)別

1.概念

  • vector:連續(xù)存儲(chǔ)的容器,動(dòng)態(tài)數(shù)組,在堆上分配空間,底層實(shí)現(xiàn):數(shù)組。當(dāng)vector增加新元素時(shí),如果未超過(guò)當(dāng)時(shí)的容量,則還有剩余空間,那么直接添加到最后,然后調(diào)整迭代器。如果沒(méi)有空間了,就會(huì)重新配置原有元素個(gè)數(shù)的兩倍空間,然后將原空間元素通過(guò)復(fù)制的方式初始化新空間,再向新空間添加元素,然后析構(gòu)并釋放原有空間,之前的迭代器會(huì)失效。
    性能:
    插入:在最后插入(空間夠):很快
    在最后插入(空間不夠):需要內(nèi)存申請(qǐng)和釋放,以及對(duì)之前數(shù)據(jù)進(jìn)行拷貝
    在中間插入(空間夠):內(nèi)存拷貝
    在中間插入(空間不夠):需要內(nèi)存申請(qǐng)和釋放,以及對(duì)之前的數(shù)據(jù)機(jī)型拷貝
    刪除:在最后刪除很快
    在中間刪除:內(nèi)存拷貝
    適用場(chǎng)景:經(jīng)常隨機(jī)訪問(wèn),且不經(jīng)常對(duì)非尾字節(jié)點(diǎn)進(jìn)行插入刪除。
  • list:動(dòng)態(tài)鏈表,在堆上分配空間,每插入一個(gè)元素都會(huì)分配空間,每刪除一個(gè)元素都會(huì)釋放空間。底層實(shí)現(xiàn):雙向鏈表。
    性能:
    訪問(wèn):隨機(jī)訪問(wèn)性能很差,只能快速訪問(wèn)頭尾節(jié)點(diǎn)
    插入:很快,一般是常數(shù)開銷
    刪除:很快,一般是常數(shù)開銷
    適用場(chǎng)景:經(jīng)常插入刪除大量數(shù)據(jù)

2.區(qū)別

  • vector底層實(shí)現(xiàn)是數(shù)組,list底層實(shí)現(xiàn)是雙向鏈表
  • vector支持隨機(jī)訪問(wèn),list不支持
  • vector是順序內(nèi)存,list不是
  • vector在中間節(jié)點(diǎn)進(jìn)行插入刪除會(huì)導(dǎo)致內(nèi)存拷貝,list不會(huì)
  • vector隨機(jī)訪問(wèn)性能好,插入刪除性能差,list相反
  • vector一次性分配好內(nèi)存,不夠時(shí)才進(jìn)行2倍擴(kuò)容,list每次插入新節(jié)點(diǎn)都會(huì)進(jìn)行內(nèi)存申請(qǐng)

3.應(yīng)用
vector擁有一段連續(xù)的內(nèi)存空間,因此支持隨機(jī)訪問(wèn),如果需要高效的隨機(jī)訪問(wèn),而不在乎刪除和插入的效率,使用vector
list擁有一段不連續(xù)的內(nèi)存空間,如果需要高效的插入和刪除,而不關(guān)心隨機(jī)訪問(wèn),使用list

總結(jié)

以上是生活随笔為你收集整理的C/C++基础知识点(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。