C++面試題精簡整理

1.classstruct區別:

C++中完全可以刪除 struct 關鍵字,保留 struct 關鍵字是爲了兼容C。class和struct地唯一區別:class默認域是 privatestruct 默認域是 public。現在C++編程常使用struct作爲一個組合。例如

struct Combination{
    int first;
    int second;
};

2.new 和malloc的區別:

new的底層是由malloc實現的。主要區別:(1)malloc是標準函數,new是運算符,new可以調用構造函數。

                                                                 (2)new返回的是指定指針類型,malloc返回的是void*,需要進行強制轉換。

3.指針和引用的區別:

指針繁雜、不利於開發,開發者使用引用代替指針的部分功能。主要區別:(1)引用即是變量的別名,作用相當於常指針,只能指向一個對象(後面不可更改),而指針可以多次改變指向的對象。(2)指針可以有多級指針。

4.C++內存分配

靜態區存放全局變量、靜態變量。棧存放局部變量。堆存放動態內存分配。

堆、棧區別:(1)管理方式不同:棧是由編譯器自動申請和釋放空間,堆是需要程序員手動申請和釋放;

                      (2)   空間大小不同:棧的空間是有限的,在32位平臺下,VC6下默認爲1M,堆最大可以到4G;

                      (3)   分配效率不同:棧的效率比堆高很多。

全局變量、靜態變量、局部變量區別:

  作用域 生存週期
全局變量 全局 程序的整個運行過程
靜態變量 代碼塊作用域 程序的整個運行過程
局部變量 代碼塊作用域 函數調用週期

 

5.const和define區別

(1)define在預處理階段進行替換,const在編譯時確定其值。

(2)define – 無類型,不進行類型安全檢查,可能會產生意想不到的錯誤;const – 有數據類型,編譯時會進行類型檢查。

  編程時優先使用const!

6.類

封裝:將類的數據、函數封裝在一起,構成一個定義類

繼承:在一般類基礎上,繼承和派生出特定類,可以擺脫重複分析、重複開發困境。

構造函數:初始化工作

析構函數:清理工作,生存週期結束後自動調用

複製構造函數:複製時調用,應用場景:(1) b=a;(2)函數 return a; (3) 函數形參傳遞

7.多態

多態可以分爲靜態多態(編譯時的多態,靜態綁定)和動態多態(運行時的多態,動態綁定)

靜態多態:函數重載,運算符重載

//函數重載的例子
int max(int a,intb);
int max(double a,double b);
int max(int a,int b,int c);
int max(int A[]);

動態多態:動態多態必須藉助虛函數,只有通過基類的指針或者引用調用虛函數時,纔會發生動態綁定。

8.內聯函數(inline函數)

頻繁調用、代碼簡單的函數,適合定義爲inline函數。編譯內聯函數時,直接把內聯函數代碼插入每一個調用它的地方。

優點:加快函數調用速度,加快程序執行。缺點:增加了編譯後的代碼長度。

9.虛函數

虛函數是動態綁定的基礎。如果需要通過基類的指針指向派生類的對象,並且訪問某個與基類同名函數,那麼必須將這個同名函數定義爲虛函數。

構造函數不能使用虛函數,析構函數最好使用虛函數(基類的指針指向派生類的對象,通過delete釋放該指針時,需調用派生類的析構函數)。

10.內存泄漏

程序在運行過程中動態申請的內存空間不再使用後沒有及時釋放,導致那塊內存不能被再次使用。

避免方法:及時通過delete、free釋放空間,使用智能指針。

11.智能指針

基本思想:將指針封裝成類,指針對象生存週期結束時自動調用析構函數釋放指針。

 

12.C++編譯過程

與C文件編譯過程一致,以下是《CSAPP深入理解計算機系統》中編譯例子:

 

進階:

大端、小端:

大端模式,是指數據的高字節保存在內存的低地址。小端模式,是指數據的高字節保存在內存的高地址中(定義相當繞口,可以不記)。

程序判斷自己計算機是大端還是小端:

    int a=1;
    char *p=(char *)&a;
    if(*p==1) printf("小端\n");
    else      printf("大端\n");

友元

友元函數:定義類外的函數爲友元函數可以訪問此類的數據成員。

友元類:聲明A爲B的友元類,A中可以直接訪問B類的數據成員。

static全局變量:

//A.CPP
int a;
//B.cpp
extern int a;

B.cpp文件能夠訪問變量a

//A.CPP
static int a;
//B.cpp
extern int a;

B.cpp文件不能夠訪問變量a

邊界對齊:

最基本的思想:長度爲N的變量,在內存中的起始地址必須能夠被N整除,比如int變量的地址必須是4的倍數。

 

參考:

《C++語言程序設計》

《CSAPP:深入理解計算機系統》

nowcoder面經

https://blog.csdn.net/cherrydreamsover/article/details/81627855

https://www.cnblogs.com/inception6-lxc/p/8686156.html

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