1.class、struct區別:
C++中完全可以刪除 struct 關鍵字,保留 struct 關鍵字是爲了兼容C。class和struct地唯一區別:class默認域是 private,struct 默認域是 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