C 常見問題集錦

2021-08-09 20:08:44 字數 4672 閱讀 3827

1、new/delete是c++的操作符,而malloc/free是c中的函式。

2、new做兩件事,一是分配記憶體,二是呼叫類的建構函式;同樣,delete會呼叫類的析構函式和釋放記憶體。而malloc和free只是分配和釋放記憶體。

3、new建立的是乙個物件,而malloc分配的是一塊記憶體;new建立的物件可以用成員函式訪問,不要直接訪問它的位址空間;malloc分配的是一塊記憶體區域,用指標訪問,可以在裡面移動指標;new出來的指標是帶有型別資訊的,而malloc返回的是void指標。

4、new/delete是保留字,不需要標頭檔案支援;malloc/free需要標頭檔案庫函式支援。

5.有了malloc/free為什麼還要new/delete?

1) malloc與free是c++/c語言的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。

2) 對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。

因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。

6.物件導向定義

術語定義:把一組資料結構和處理它們的方法組成物件(object),把相同行為的物件歸納為類(class),通過類的封裝(encapsulation)隱藏內部細節,通過繼承(inheritance)實現類的特化(specialization)/泛化(generalization),通過多型(polymorphism)實現基於物件型別的動態分派(dynamic dispatch)。

7.c++中指標和引用的區別

(1)指標:指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元;而引用跟原來的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定義了乙個整形變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a儲存單元的位址。

而下面2句定義了乙個整形變數a和這個整形a的引用b,事實上a和b是同乙個東西,在記憶體占有同乙個儲存單元。

(2)可以有const指標,但是沒有const引用;

(3)指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)

(4)指標的值可以為空,但是引用的值不能為null,並且引用在定義的時候必須初始化;

(5)指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了。

(6)」sizeof引用」得到的是所指向的變數(物件)的大小,而」sizeof指標」得到的是指標本身的大小;

(7)指標和引用的自增(++)運算意義不一樣;

8.在c++中,結構裡的資料成員和成員函式的預設訪問許可權是?類中的資料成員和成員函式的預設訪問許可權是?

結構體中預設public,類中預設private

9.分析c++中的結構體與類的區別:

先來說說c++中兩者的相同之處: 結構體中也可以包含函式;也可以定義public、private、protected資料成員;定義了結構體之後,可以用結構體名來建立物件。也就是說在c++當中,結構體中可以有成員變數,可以有成員函式,可以從別的類繼承,也可以被別的類繼承,可以有虛函式。總的一句話:class和struct的語法基本相同,從宣告到使用,都很相似,但是struct的約束要比class多,理論上,struct能做到的class都能做到,但class能做到的stuct卻不一定做的到。

對於成員訪問許可權以及繼承方式,class中預設的是private,而struct中則是public。class還可以用於表示模板型別,struct則不行。

注意struct是可以繼承與被繼承的,這一點有的人可能忽略了。

**總結一下就是:

概念:class和struct的語法基本相同,從宣告到使用,都很相似,但是struct的約束要比class多,理論上,struct能做到的class都能做到,但class能做到的stuct卻不一定做的到。

型別:struct是值型別,class是引用型別,因此它們具有所有值型別和引用型別之間的差異。

效率:由於堆疊的執行效率要比堆的執行效率高,但是堆疊資源卻很有限,不適合處理邏輯複雜的大物件,因此struct常用來處理作為基型別對待的小物件,而class來處理某個商業邏輯。

關係:struct不僅能繼承也能被繼承 ,而且可以實現介面,不過class可以完全擴充套件。內部結構有區別,struct只能新增帶參的建構函式,不能使用abstract和protected等修飾符,不能初始化例項字段。**

10.c++虛函式的作用

虛函式的作用,用專業術語來解釋就是實現多型性(polymorphism),多型性是將介面與實現進行分離;用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。c++中的虛函式就是用來解決這個問題的。虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。

當基類的成員函式宣告為虛函式時,不管其子類的同名成員函式,是否宣告為virtual函式,均為虛函式。

11.c++虛函式和純虛函式的區別

為什麼要用純虛函式?

在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。為了解決這個問題,方便使用類的多型性,引入了純虛函式的概念,將函式定義為純虛函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。

在什麼情況下使用純虛函式(pure vitrual function)?

1,當想在基類中抽象出乙個方法,且該基類只做能被繼承,而不能被例項化;

2,這個方法必須在派生類(derived class)中被實現;

如果滿足以上兩點,可以考慮將該方法申明為pure virtual function.

我們來舉個例子,我們先定義乙個形狀的類(cshape),但凡是形狀我們都要求其能顯示自己。所以我們定義了乙個類如下:

class cshape

; };

但沒有cshape這種形狀,因此我們不想讓cshape這個類被例項化,我們首先想到的是將show函式的定義(實現)部分刪除如下:

class cshape

; 當我們使用下面的語句例項化乙個cshape時:

cshape cs; //這是我們不允許的,但僅用上面的**是可以通過編譯(但link時失敗)。

怎麼樣避免乙個cshape被例項化,且在編譯時就被發現?

答案是:使用pure virtual funcion.

我們再次修改cshape類如下:

class cshape

; 12.虛擬記憶體和物理記憶體的定義和區別

物理記憶體就是實際的記憶體,在cpu中指的是定址空間的大小,比如8086只有20根位址線,那麼它的定址空間就是1mb,我們就說8086能支援1mb的物理記憶體,即使我們安裝了128m的記憶體條在板子上,我們也只能說8086擁有1mb的物理記憶體空間。同理我們現在大部分使用的是32位的機子,32位的386以上cpu就可以支援最大4gb的物理記憶體空間了。

為什麼會有虛擬記憶體和物理記憶體區別呢?

因為物理記憶體的大小是有限的,虛擬記憶體是乙個程序需要的總共大小,大小有可能大於物理記憶體。正在執行的乙個程序,他所需的記憶體是有可能大於記憶體條容量之和的,比如你的記憶體條是256m,你的程式卻要建立乙個2g的資料區,那麼不是所有資料都能一起載入到記憶體(物理記憶體)中,勢必有一部分資料要放到其他介質中(比如硬碟),待程序需要訪問那部分資料時,在通過排程進入物理記憶體。所以,虛擬記憶體是程序執行時所有記憶體空間的總和,並且可能有一部分不在物理記憶體中,而物理記憶體就是我們平時所了解的記憶體條。

什麼是虛擬記憶體位址和物理記憶體位址呢?

假設你的計算機是32位,那麼它的位址匯流排是32位的,也就是它可以定址0~0xffffffff(4g)的位址空間,但如果你的計算機只有256m的物理記憶體0x~0x0fffffff(256m),同時你的程序產生了乙個不在這256m位址空間中的位址,那麼計算機該如何處理呢?回答這個問題前,先說明計算機的記憶體分頁機制。對虛擬記憶體位址空間(32位為4g)分頁產生頁(page),對物理記憶體位址空間(假設256m)分頁產生頁幀(page frame),這個頁和頁幀的大小是一樣大的,所以呢,在這裡,虛擬記憶體頁的個數勢必要大於物理記憶體頁幀的個數。在計算機上有乙個頁表(page table),就是對映虛擬記憶體頁到物理記憶體頁的,更確切的說是頁號到頁幀號的對映,而且是一對一的對映。但是問題來了,虛擬記憶體頁的個數 > 物理記憶體頁幀的個數,豈不是有些虛擬記憶體頁的位址永遠沒有對應的物理記憶體位址空間?不是的,作業系統是這樣處理的。作業系統有個頁面失效(page fault)功能。作業系統找到乙個最少使用的頁幀,讓他失效,並把它寫入磁碟,隨後把需要訪問的頁放到頁幀中,並修改頁表中的對映,這樣就保證所有的頁都有被排程的可能了。這就是處理虛擬記憶體位址到物理記憶體的步驟。

結起來說,虛擬記憶體位址的大小是與位址匯流排位數相關,物理記憶體位址的大小跟物理記憶體條的容量相關。

12.

RedHat Linux常見問題集錦

修改主機名 vi etc sysconfig network,修改hostname一行為hostname 主機名,重啟後也能生效 ret hat linux啟動到文字介面 不啟動xwindow 將 etc inittab中 id 5 initdefault 一行中的5改為3 redhat的自動問題 ...

Android Studio 常見問題集錦

manifest merger failed with multiple errors,see logs 原因 as的gradle外掛程式缺省會啟用manifest merger tool,若library專案中也定義了與主專案相同的屬性 例如預設生成的android icon和android th...

開發中常見問題集錦

這篇文章是專門用來記錄開發中一些常見的bug以及常用的零碎知識點,我會隔一段時間更新內容 最好不要在uiviewcontroller的loadview方法中改變狀態列的可視性 比如狀態列由顯示變為隱藏 或者由隱藏變為顯示 因為會導致重複呼叫2次loadview和viewdidload方法 假設狀態列...