天天看點

考研複試:cpp面試題整理

C和C++和java的差別?

①c是面向過程的語言,cpp和java是面向對象的語言。這是他們最本質的差別。

②C和cpp是直接編譯運作,java是在虛拟機中運作的。

③指針的方面,c和c++可以直接用指針來通路記憶體,java沒有指針。

C++裡的結構體和類的差別:

結構體預設通路權限全是public

類通路權限是public 、private、protected,預設通路權限是private

Stl含義:

标準模闆庫Standard Template Library是容器和算法的集合

eg:Vector(向量)、stack(棧)、set(集合)、queue(隊列)、map(哈希表)

指針和引用的差別?

①指針是存儲變量位址的變量。

②引用在函數傳參的時候用到。引用本身也是位址,在傳遞的時候不是值,傳的是位址。

面向對象的三大特性

封裝:是把成員變量和成員函數封裝進一個類并賦予它一些權限。

繼承:首先要有一個基類,然後派生類繼承基類,派生類能繼承基類的成員變量和成員函數。

多态:多态就是同一個接口,使用不同的執行個體而執行不同操作。簡單的說,一個接口,多種實作方式。Eg:函數重載。

編譯一個程式記憶體分為哪兩部分?

堆記憶體和棧記憶體。

關鍵字和辨別符的差別?

辨別符是變量名。比如a、b、c…

關鍵字是new、delete、int、break…

運算符重載和函數重載的差別?

運算符本身也是函數,運算符包涵單目和雙目運算符。

如果運算符重載的話需要參數數量的問題。

重載和重寫?

++重寫(override覆寫)++:如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫。

++重載++:如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型或有不同的參數次序,則稱為方法的重載

方法的重寫(Overriding)和重載(Overloading)是Java多态性的不同表現。

重寫(Overriding)是父類與子類之間多态性的一種表現,而重載(Overloading)是一個類中多态性的一種表現。

全局變量(global variable)和局部變量(local variable)的差別?

  1. 作用域不同:全局變量的作用域為整個程式,而局部變量的作用域為目前函數或循環等
  2. 記憶體存儲方式不同:全局變量存儲在堆區中,局部變量存儲在棧區
  3. 生命期不同:全局變量的生命期和主程式一樣,随程式的銷毀而銷毀,局部變量在函數内部或循環内部,随函數的退出或循環退出就不存在了
  4. 使用方式不同:全局變量在聲明後程式的各個部分都可以用到,但是局部變量隻能在局部使用。函數内部會優先使用局部變量再使用全局變量

構造函數和析構函數是幹什麼的?

構造:對象執行個體化的時候自動運作的函數,進行對象初始化。

析構:撤銷對象的時候會自動運作的函數,可以是釋放對象配置設定的記憶體空間。

Static:

它是一個聲明靜态變量的關鍵字。靜态變量就是空間裡獨立開放的一塊靜态空間去儲存這個變量的值,如果定義了一個靜态類變量,那麼所有的執行個體都可以共享這個類變量。

class 裡的static,比如我有個類A 裡面有個static int=5,執行個體一個a,令a.這個值=10,再執行個體一個b,那麼b.這個值是多少呢?是10。因為單獨開辟了一個空間,不管多少個執行個體都是指向那裡,是以這個可以用來統計執行個體個數,也可以控制執行個體數量。比如每執行個體一個,可以讓一個靜态變量++或者–

Const:

const 修飾符:用于定義符号常量。用關鍵字 const 修飾的辨別符稱為符号常量。常量就是不能修改值的變量,而且必須有一個初始的值。

預處理程式

C++的預處理程式不是 C++編譯程式的一部分,它負責在編譯程式的其他部分之前分析處理預處理語句,為與一般的 C++語句差別,所有預處理語句都以位于行首的符号“#”開始,作用是把所有出現的、被定義的名字全部替換成對應的“字元序列”。

預處理語句有三種:宏定義、檔案包含(也成嵌入指令)和條件編譯

檔案包含是指一個程式把另一個指定檔案的内容包含進來,書寫時可以使用引号也可以使用尖括号,前者引用自己定義的包含檔案,如:#include “E:\prog\myfile.h” ,後者引用系統提供的包含檔案,如标準輸入輸出是定義,在标準庫 iostream 中的,引用時要包括以下兩條語句:

#include //包含頭檔案

using namespace std; //使用命名空間

面向過程和面向對象的差別:

面向過程主要依賴于三大結構:順序結構、選擇結構、循環結構,世界上所有的程式都可以用面向過程去實作。

面向對象就是在面向過程的基礎上加入了類和對象的概念。面向對象更适合人類的思想,更适合于程式設計。

認識 C++面向過程編譯的特點

++一、使用函數重載++

函數重載:C++允許為同一個函數定義幾個版本,進而使一個函數名具有多種功能,

這稱為函數重載。

假設有一個函數 max,分别具有以下函數原型:

int max(int,int); //2 個整型參數的函數原型

int max(int,int,int);//3個整型參數的函數原型

隻要分别為不同參數的max編制相應的函數體,就可以實作各自的功能。

++二、新的基本資料類型及其注意事項++

1、void 是無類型辨別符,隻能聲明函數的傳回值類型,不能聲明變量。

2、C++還比 C 多了 bool(布爾)型。

3、位址運算符“&”用來取對象存儲的首位址,對于數組,則數組名就是數組的

首位址。

如:int x=56;定義 x,VC++6.0 使用 4 個位元組存儲對象 56,假設存放的内

存首位址用十六進制表示為 006AFDEC,則語句 cout <<&x;自動使用十六進制輸

出存儲的首位址 006AFDEC。

4、C++與 C 一樣,也使用轉義序列。如:’\0’表示 ASCII 碼值為零的空字元

(NULL),’\101’表示字元 A。

++三、動态配置設定記憶體++

1、在使用指針時,如果不使用對象位址初始化指針,可以自己給它配置設定位址。

對于隻存儲一個基本類型資料的指針,申請方式如下:

new 類型名[size]//申請可以存儲size個該資料類型的對象

不再使用時,必須使用delete指針名;來釋放已經申請的存儲空間。

如:

……

double *p; //聲明 double 型指針

p=new double[3] //配置設定3個double型資料的存儲空間

……

delete p; //釋放已申請的存儲空間

……

2、C 必須在可執行語句之前集中聲明變量,而 C++可以在使用對象時再聲明或

定義。

++四、引用++

1、引用:就是為現有的對象起個别名,别名的位址與引用對象的位址是一樣的。所謂“引用”,就是将一個新辨別符和一塊已經存在的存儲區域相關聯。是以,使用引用時沒有配置設定新的存儲區域,它本身不是新的資料類型。可以通過修改引用來修改原對象,但是不能有空引用,在程式中必須確定引用是和一塊正确的存儲區域關聯。

引用的聲明方式為: 資料類型 & 别名=對象名; 注意對象在引用前必須先初始化,另外聲明中符号“&”的位置無關緊要,比如 int& a=x; 、int &

a=x; 和 int &a=x; 等效。

例:

……

int x=56; //定義并初始化 x

int & a=x; //聲明 a 是 x 的引用,二者位址相同

int &r=a; //聲明 r 是 a 的引用,二者位址相同

……

r=25; //改變 r,則 a 和 x 都同步變化

……

面向過程的優點和缺點:

缺點:代碼的複用性(寫過一遍再寫一遍)極差,編寫難度大。

好處:運作速度快。

面向對象的好處和缺點:

缺點:占用資源會變多,計算量大。

好處:複用性高。

運算符重載中 加号在前面和後面的差別?

Cpp編輯器可以通過在運算符函數參數表中是否插入關鍵字int來區分這兩種方式

聲明:

X operator++();//字首方式

X operator++(int);//字尾方式

調用時,參數int一般傳遞給值0

X ob;

++ob;

ob++;//隐式調用ob.operator++(int)

ob.operator++();

ob.operator++(0);//顯式調用ob.operator++(int),意為ob++

new和malloc的差別?

new一個對象,自動配置設定大小,并且自動調用構造函數。New可以被重載。有的時候你會看到new[],這些都能重載,比如你人為定義的datastructure,線性表什麼的。delete []隻能對數組。

malloc是系統方法需要手動配置設定記憶體,不能重載,不會自動執行構造函數

c語言中和str相關的幾個函數?

Strcmp:C/C++函數,比較兩個字元串

設這兩個字元串為str1,str2,

若str1==str2,則傳回零;

若str1<str2,則傳回負數;

若str1>str2,則傳回正數。

matlab中函數,strcmp(s1,s2)

判斷兩個字元串s1和s2是否相同,相同傳回true ,不同傳回false

Strcat:是用來連接配接兩個字元串的,原型是char *strcat(char *dest,char *src),作用是把src所指字元串添加到dest結尾處。

Strcopy:把從後面位址開始且含有NULL結束符的字元串複制到以前面開始的位址空間

指針、位址和引用的差別?

取指針是* ,位址和引用是與号

指針:指針是一個變量,隻不過這個變量存儲的是一個位址,指向記憶體的一個存儲單元。

引用跟原來的變量實質上是同一個東西,隻不過是原變量的一個别名而已,在函數傳參的時候用到。

面向過程的程式設計

- 傳統的設計方法,圍繞功能進行;
- 用一個函數實作一個功能;
- 所有的資料都是公用的;
- 一個函數可以使用任何
  一組資料;
- 一組資料又能被多個函
  數所使用。  
           

面向對象的程式設計

-圍繞現實世界的實體(對象)進行設計;

-程式設計者從設計函數功能轉向:設計類與對象(如何用屬性和行為來描述一個實體);如何向實體發送消息以排程實體的行為。

- 一種以認識認識世界的方法為參考的程式設計方法,更為自然,更利于大型程式的組織和實作。
           

類的概念

++Def++:類是對一群具有相同屬性(特征/資料),表現相同行為的對象的描述。→抽象

++類的封裝++:将屬性(資料)和行為(操作代碼)放在一起,形成一個基本的機關,對外保留通路接口,隐藏資料。比如,pool的操作對外公開可通路,資料部分隐藏。

++類的繼承++:與客觀的世界相仿,類可以作為父親(父類/基類)派生出子類(派生類)。子類可以從父類那裡繼承東西(資料和操作)。比如,馬類可派生出白馬類和黑馬類,pool可作為父類派生出圓遊泳池類和方遊泳池類。

類的聲明

class 類名{

public:
   公有資料和函數
private:
   私有資料和函數
           

};

資料成員的聲明:

  • 像聲明普通變量的方式來聲明,但不允許聲明時初始化;
  • 允許是任何資料類型, 包括使用者自定義的類型(不允許是目前正在定義的類型);
  • 聲明時可以用static修飾,可以用const修飾;不允許使用auto,register和extern修飾。

成員函數的聲明:

  • 普通函數:非成員函數,即類外定義的函數。

    大部分成員函數可像聲明普通函數的方式在類内聲明,可以使用const修飾。

  • 常量成員函數:常量成員函數可以改變局部變量,全局變量或其他類對象的值,但不允許修改本類中的資料成員的值。

    普通函數不可以作為常量函數(不能用const修飾)

類内會有一些特殊的成員函數聲明方式跟普通函數不同:

  • 構造函數-負責對象的初始化
  • 拷貝構造函數-負責對象的拷貝初始化
  • 析構函數-負責對象的撤銷

類的使用

類類型是一種使用者自定義類型,程式員可以使用這個新類型在程式中聲明變量,具有類類型的變量稱為對象。

pool apool;

X x1,x2,x3;

可以使用sizeof()驗證對象所占用的空間大小。

類的通路控制

規定類的成員(資料成員和成員函數)對外部的開放程度。

public:可以讓本類内成員和其他程式代碼使用的部分放在公有通路控制内。–類的對外接口

在聲明了一個類以後,使用者主要是通過調用公用的成員函數來實作類提供的功能(例如對資料成員設定值,顯示資料成員的值,對資料進行加工等)。
           

private:隻允許本類内成員使用的部分放在私有通路控制内。–類的對外隐藏

protected:允許繼承體系中的類成員通路的部分放在受保護通路控制内

類與對象的關系

每一個實體都是對象。有一些對象是具有相同的結構和特性的。每個對象都屬于一個特定的類型。類是關于一組結構與行為相似的對象的共同特性的描述。

在Cpp中對象的類型稱為類(class)。類代表了某一批對象的共性和特征。即:類是對象的抽象,而對象是類的具體執行個體(instance)。

在Cpp程式中,類是面向對象程式靜态文本的概念,而對象是面向對象程式動态運作時的概念。

對象的使用(在類外使用公有成員):

通過對象名和成員運算符通路對象中的成員

apool.build();
           

通過指向對象的指針通路對象中的成員

pool *ptr=&apool;
ptr->build();
(*ptr).build();
★類内的隐含對象指針this:
  所有在類内使用類成員的行為都是通過this進行。
  this可以省略。
           

如何設計類?

Eg:停車場收費:有一個停車場,需要替管理者設計一個程式來解決停車收費的問題。

1小時内免費;

1小時以上:

超過15分鐘不到30分鐘按半小時收費; 
        超過30分鐘不到1小時按1小時收費;
        超過1小時按每小時4元收費;
           

從應用的需求出發,面向對象的分析:

停車場: 位置,大小(可以停幾輛車),收費标準,幾個管理者……

管理者: 性别,年齡,籍貫,身高,體重,受教育程度,……

汽車: 品牌,顔色,輪子個數,……

時鐘/時間: 品牌,是否正常工作,時,分,秒,……

++對一個為管理者設計的收費系統,哪個對象是需要關注的?++

時間+收費标準

++如何設計時鐘類?++

·要如何使用時鐘?

有車進入停車場的時候看一下時鐘登記;

有車離開停車場的時候看一下時鐘登記;

→計算停車時間,結合收費标準收費。

·時鐘是什麼樣的?→模拟數字時鐘

有:時,分,秒 (hh:mm:ss)

可以:顯示時間

設定時間→調整時間(調整時,調整分,調整秒)

類的執行個體(考慮下列類的定義)

1.循環計數器類

  1. date類

3.平面幾何的位置類position

4.複數類

繼續閱讀