考研複試問答(c/c++部分)

轉載請註明出處:https://blog.csdn.net/xuezoutianya/article/details/106038947

1、數組名和指針的區別?
    答:數組名類似一個const指針,不可被賦值;而指針是一個變量,可以被賦值
        sizeof運算符對數組名的運算結果是數組的大小;對指針或者const指針的運算結果是指針自身佔據空間大小
        綜上所述,數組名是一個符號,唯一標記數組空間的首地址

2、c/c++常見算術類型的大小?
    答:算術類型的尺寸在不同機器上有所差別。一個char的大小和一個機器字節相等。
        一個int至少和一個short一樣大,一個long至少和一個int一樣大,一個long long至少和一個long一樣大。
        通常,char8位,short16位,int32位,long32位/64位,long long64位,float32位,double64位

3、定義和聲明的聯繫和區別?
    答:聲明使得名字爲程序所知,定義負責創建與名字關聯的對象
        聲明可以多次,定義只能一次
        聲明和定義可以融合
        (extern在不進行初始化的情況下表示聲明)

4、什麼是對象?
    答:一塊能存儲數據並具有某種類型的內存空間

5、什麼是形參?什麼是實參?
    答:形參是函數被調用時用於接收實參值的變量
        實參是在調用函數時傳遞給函數的參數

6、什麼是引用?和指針的區別?
    答:引用即別名,是爲一個已經存在的對象所起的另外一個名字(引用佔用內存,大小同指針的大小)
        和指針的區別:1.引用必須被初始化且初始化後不可改變,指針相反
                      2.引用不能爲空,指針可以
                      3.引用的兩個主要用途:作爲函數參數或作爲函數返回值

7、c語言中static關鍵字的作用有哪些?
    答:在C中,static主要定義全局靜態變量(限制作用域)、定義局部靜態變量(改變存儲區)、定義靜態函數(限制作用域)。
        (還可以用於定義c++中靜態函數和靜態成員)

8、c語言中存儲區怎麼劃分?什麼是作用域?
    答:分區:分別是靜態存儲區,棧區,堆區,常量區,代碼區
        作用域:通常來說,一段程序代碼中所用到的名字並不總是有效/可用的,而限定這個名字的可用性的代碼範圍就是這個名字的作用域。

9、堆棧溢出的原因有哪些?
    答:堆空間溢出:申請動態內存太大
        棧空間溢出:函數調用層次太深

10、不能做switch()參數的是?
    答:實型變量(float,double,string),能做switch()參數的是:byte,char,short,int,long,bool,整數類型和枚舉類型

11、如果局部變量與全局變量重名會出現什麼?
    答:函數體內局部變量會屏蔽全局變量,若要使用被屏蔽的全局變量,需要在全局變量前加上::(域運算符)

12、全局變量可不可以在定義在一個被多個C文件包含的頭文件中?
    答:不可以。在被多個c文件包含的頭文件中定義變量會在編譯時報錯,提示重複定義(即使加static關鍵字過了編譯,但是相當於多個源文件有多個同名的局部變量)

13、什麼是野指針?
    答:野指針就是指向一個已銷燬的對象或者訪問受限內存區域的指針

14、什麼是斷點調試?
    答:斷點是調試器設置源程序在執行過程中自動進入中斷模式的一個標記。當程序運行到斷點時,程序中斷執行,進入調試狀態。

15、字符數組的初始化?字符數組和字符串
    答:字符數組的初始化有兩種方式,用單個字符列表和用字符串常量;用常量字符串初始化數組時系統在最後一個字符後面加\0。

16、什麼是回調函數?
    答:回調函數即定義一個函數,然後把這個函數作爲參數傳入子程序中,由子程序在運行時通過函數指針來調用的函數。

17、const關鍵字的作用?
    答:常變量:不能被修改的變量(局部常變量在編譯時,全局常變量在運行時)
        const指針:不能改變指向的指針變量
        指向常量的指針:可以改變指向,但不能通過該指針修改對象
        常成員函數:不能修改類的成員變量
        對const的引用:對象可修改,但不能通過該引用修改對象

18、define和const的區別?
    答:生效時間:define在預編譯,const在編譯和運行階段
        類型檢查:define是字符替換,無類型檢查;const有數據類型,有類型檢查
        存儲方式:define定義的宏常量在內存中可以存在若干備份;const定義的只讀變量在內存中只存在一份

19、默認構造函數的特點?
    答:默認構造函數一個類只能有一個,由不帶參數的構造函數,當類中沒有顯式定義任何構造函數時,編譯器自動生成一個公有的默認構造函數。
        (多個構造函數類似函數重載)

20、拷貝構造函數
    答:本質上也是一種構造函數,當用一個對象創建另一個對象時調用,而不會調用類自帶的構造函數。
        複製構造函數的參數是引用或者是常量引用,不自己定義就會編譯器生成默認複製構造函數,不是無參構造函數
        起作用:參數放對象,初始化語句
        對象間賦值不會導致賦值函數被調用

20、什麼是命名空間?命令空間可以嵌套嗎?
    答:概念:命名空間是一種防止名字衝突的機制,分割了全局命名空間,其中每個命名空間是一個作用域
        嵌套:命名空間可以嵌套,可以取別名

21、關於繼承方式和可見性?
    答:public繼承方式:1.基類中所有public成員在派生類中爲public屬性;
                        2.基類中所有protected成員在派生類中爲protected屬性;
                        3.基類中所有private成員在派生類中不可訪問。
        protected繼承方式:1.基類中的所有public成員在派生類中爲protected屬性;
                           2.基類中的所有protected成員在派生類中爲protected屬性;
                           3.基類中的所有private成員在派生類中仍然不可訪問。
        private繼承方式:1.基類中的所有public成員在派生類中均爲private屬性;
                         2.基類中的所有protected成員在派生類中均爲private屬性;
                         3.基類中的所有private成員在派生類中均不可訪問。

22、面向對象三大特性有哪些?如何理解?
    答:封裝:封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。
        繼承:使用現有類的所有功能,並在不重寫現有類的情況下對這些功能進行擴展。
        多態:不同的對象對同一個消息產生不同的響應。靜態多態即函數重載和運算符重載,動態多態用虛函數實現,允許將子類類型的指針賦值給父類類型的指針。
        (抽象:抽象就是將一些事物的共性和相似點抽離出來,並將這些屬性歸爲一個類)

23、請你說一說你理解的虛函數和多態?
    答:多態的實現主要分爲靜態多態和動態多態,靜態多態主要是重載,在編譯的時候就已經確定;動態多態是用虛函數機制實現的,在運行期間動態綁定。
        虛函數的實現:在有虛函數的類中,類的最開始部分是一個虛函數表的指針,這個指針指向一個虛函數表,表中放了虛函數的地址,實際的虛函數在代碼段(.text)中。
                      當子類繼承了父類的時候也會繼承其虛函數表,當子類重寫父類中虛函數時候,會將其繼承到的虛函數表中的地址替換爲重新寫的函數地址。
                      使用了虛函數,會增加訪問內存開銷,降低效率。

24、c語言如何實現差錯控制?
    答:c語言中的差錯控制通過條件判斷語句實現,判斷參數是否在正確的範圍內

25、不用中間變量怎麼交換兩個數?
    答:1.利用兩數之和減去另一個數的方式
        2.利用異或運算
        (乘除不能碰見0,所以乘除不行)

26、自增運算符前置和後置,在無編譯器優化的情況下,哪個效率更高?
    答:自增運算符前置效率更高。因爲前置運算符先將自身遞增,然後返回自身;後置運算符先創建自身的一個副本,而後自身遞增,然後返回副本。

27、程序怎麼更有效率執行?
    1、減少程序在覈心態和用戶態之間的切換
    2、使用線程代替進程以減少系統資源的開銷
    3、使用 inline,避免函數調用的開銷;
    4、自己管理內存,避免內存分配的開銷;

28、如果同時定義了兩個函數,一個帶const,一個不帶,會有問題嗎?
    答:不會,這相當於函數的重載。

29、請你回答一下new/delete與malloc/free的區別是什麼
    答:首先,new/delete是C++的關鍵字,而malloc/free是C語言的庫函數,後者使用必須指明申請內存空間的大小,對於類類型的對象,後者不會調用構造函數和析構函數

30、請你說說c語言中返回值的存儲?
    答:1.函數返回變量值(暫存於eax寄存器)
        2.函數返回地址(暫存於eax寄存器)

31、請你說說C語言參數壓棧順序?爲什麼?
    答:從右到左,是爲了支持可變長參數形式。對於可變參函數,需要用format來確定參數個數,從右到左壓棧,可以用棧頂指針+2得到format的地址

32、請你說一說重載和覆蓋?
    答:重載:兩個函數名相同,但是參數列表不同(個數,類型),返回值類型沒有要求,在同一作用域中
        重寫:子類繼承了父類,父類中的函數是虛函數,在子類中重新定義了這個虛函數,這種情況是重寫

33、請你來說一下C++中struct和class的區別?
    答:在C++中,可以用struct和class定義類,都可以繼承。區別在於:struct的默認繼承權限和默認訪問權限是public,而class的默認繼承權限和默認訪問權限是private。

34、請你來回答一下include頭文件的順序以及雙引號””和尖括號<>的區別?
    答:對於使用雙引號包含的頭文件,查找頭文件的路徑時優先查找當前頭文件目錄
        對於使用尖括號包含的頭文件,查找頭文件的路徑時優先查找編譯器設置的頭文件路徑

35、請你來說一下什麼時候會發生段錯誤?
    答:段錯誤通常發生在訪問非法內存地址的時候,具體來說分爲以下幾種情況:
        使用野指針或試圖修改常量區的內容

36、alloc malloc calloc realloc的區別?
    答:alloc向棧申請空間
        malloc向堆申請空間,參數爲空間大小
        calloc和malloc類似,參數爲元素數目和大小
        realloc是給一個已經分配了地址的指針重新分配空間

37、c語言函數傳輸傳遞的三種方式?
    答:值傳遞,指針傳遞,引用傳遞

38、什麼是內聯函數?
    答:編譯器處理內聯函數的調用語句時,是將整個函數的代碼插入到調用語句處,而不會產生調用函數的指令。內聯函數一般定義在頭文件,便於多個源文件編譯替換
        (如果函數語句少,調用頻繁,調用函數的開銷就相對比較大)

39、什麼是淺拷貝?什麼是深拷貝?
    答:缺省的拷貝構造函數爲淺拷貝,兩個對象共用一個存儲空間 
        深拷貝就是自己定義拷貝構造函數,需要新建一個內存空間保存數據
        (注:當一個對象的成員函數中有某種需要分配的資源,爲了防止該資源被多次析構,則需要自定義拷貝構造函數)

40、什麼是內存泄漏?
    答:內存泄漏是指程序中己動態分配的堆內存由於某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重後果

41、源碼到可執行文件的過程?
    答:預處理 編譯 彙編 鏈接

42、已定義的函數有返回值,函數調用可以作爲一個函數的實參,但是不能作爲形參,爲什麼?
    答:返回值存在eax寄存器中, 沒有地址, 只有值,不能作爲形參,但可以作爲實參。

43、c++中不會被繼承的部分?
    答:基類的構造函數、析構函數和拷貝構造函數
        基類的重載運算符
        基類的友元函數

44、什麼是抽象類?有什麼特點?
    答:包含純虛函數的類就是抽象類。抽象類不能被用於實例化對象,它只能作爲接口使用。

45、c++不能被重載的運算符有哪些?
    答:成員訪問運算符.
        成員指針訪問運算符.*
        域運算符::
        sizeof運算符sizeof
        條件運算符?:

46、棧上的局部對象調用時機?
    答:構造函數:定義對象時調用,用來初始化一個對象  
        析構函數:對象出作用域時調用

47、全局對象的構造析構函數調用時機?
    答:構造函數:進入main函數之前
        析構函數:main函數返回之後

48、什麼是this指針?
    答:this指針是指向本類對象的指針,它的值是當前被調用的成員函數所在的對象的起始地址

49、類定義的對象和類的關係?
    答:類裏面的數據成員是私有的,各自有各自的地址,成員函數是公有的,同一個類的對象,其成員函數地址是一樣的

50、函數重載的條件是什麼?函數重載的調用規則?
    答:重載條件:函數名必須相同,作用域必須相同,函數參數個數不同或者類型不同或者順序不同,返回值不同不能算函數重載
        調用規則:首先根據函數名找到對應的函數,作爲候選函數,再在候選函數中找到可以匹配的函數,匹配函數個數=0,報錯,=1則使用該函數,>1則二義性

51、面向過程和麪向對象的區別?
    答:面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一一實現,使用的時候依次調用
        面向對象是把構成問題事務分解成各個對象,建立對象的目的不是爲了完成一個步驟,而是爲了描敘某個事物在整個解決問題的步驟中的行爲

52、volatile關鍵字的作用是什麼?
    答:volatile修飾的變量防止編譯器的優化,且要求每次直接讀值。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章