1、c++中struct和class有什麼區別
(一) 預設繼承許可權。 如果不明確指定,來自 class 的繼承按照 private 繼承處理,來自 struct的繼承按照 public 繼承處理;
(二)成員的預設訪問許可權。class 的成員預設是 private 許可權,struct 預設是 public 許可權。
除了這兩點,class 和 struct 基本就是乙個東西。語法上沒有任何其它區別
struct中的成員預設為public,而class中的預設為private;如果不是為了類中由屬於自己的私有 成員,我覺得能用class解決的問題都能用struct實現。
2、volitate的作用是什麼
是用來修飾變數的,表明某個變數的值可能會隨時被外部改變,因此這些變數的訪問不能被快取到暫存器,每次使用需要重新讀取。
下面是volitate的介個例子:
1). 並行裝置的硬體暫存器(如:狀態暫存器)
2). 乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables)
3). 多執行緒應用中被幾個任務共享的變數
經常遇到的面試題:
1). 乙個引數既可以是const還可以是volatile嗎?解釋為什麼。
2). 乙個指標可以是volatile 嗎?解釋為什麼。
3). 下面的函式有什麼錯誤:
int square(volatile int *ptr)
下面是答案:
1). 是的。乙個例子是唯讀的狀態暫存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。
2). 是的。儘管這並不很常見。乙個例子是當乙個中服務子程式修改乙個指向乙個buffer的指標時。
3). 這段**有個惡作劇。這段**的目的是用來返回指標*ptr指向值的平方,但是,由於*ptr指向乙個volatile型引數,編譯器將產生類似下面的**:
int square(volatile int *ptr)
由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段**可能返回不是你所期望的平方值!正確的**如下:
long square(volatile int *ptr)
3、當乙個類a中沒有任何成員變數和成員函式時,sizeof(a) = ?
不是零,而是1,如果是0的話,宣告乙個classa[10]物件陣列,而每乙個物件占用的空間都是0;這樣就沒有辦法區分a[0],a[1]...了。
4、hash()函式的作用是什麼?
hash,一般翻譯做"
雜湊",也有直接音譯為"
雜湊"的,就是把任意長度的輸入(又叫做預對映, pre-image),通過
雜湊演算法
,變換成固定長度的輸出,該輸出就是
雜湊值。這種轉換是一種
壓縮對映
,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的
訊息摘要
的函式。
5、makefile檔案的作用?
makefile關係到了整個工程的編譯規則。乙個工程中的原始檔不計數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為makefile就像乙個
shell指令碼
一樣,其中也可以執行
作業系統
的命令。、
6、static有什麼作用?
1.限制變數的作用域(檔案級的)。
2.設定變數的儲存域(全域性資料區)。
c語言中主要用來定義: 1.
定義全域性靜態變數 :在全域性變數前面加上關鍵字static,該全域性變數變成了全域性靜態變數。全域性靜態變數有以下特點:
(1)在全域性資料區內分配記憶體
(2)如果沒有初始化,其預設值為0
(3)該變數在本檔案內從定義開始到檔案結束可見
2.定義區域性靜態變數:在區域性靜態變數前面加上關鍵字static,該區域性變數便成了靜態區域性變數。靜態區域性變數有以下特點:
(1)該變數在全域性資料區分配記憶體
(2)如果不顯示初始化,那麼將被隱式初始化為0
(3)它始終駐留在全域性資料區,直到程式執行結束
(4)其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束。
3.定義靜態函式:在函式的返回型別加上static關鍵字,函式即被定義成靜態函式。靜態函式有以下特點:
(1) 靜態函式只能在本原始檔中使用
(2)在檔案作用域中宣告的inline函式預設為static
說明:靜態函式只是乙個普通的全域性函式,只不過受static限制,他只能在檔案坐在的編譯單位內使用,不能呢個在其他編譯單位內使用。
在c++語言中新增了兩種作用:定義靜態資料成員或靜態函式成員
1.定義靜態資料成員。靜態資料成員有如下特點:
(1)記憶體分配:在程式的全域性資料區分配
(2)初始化和定義:靜態資料成員定義時要分配空間,所以不能在類宣告中初始化。
2.靜態成員函式。靜態成員函式與類相聯絡,不與類的物件相聯絡。靜態成員函式不能訪問非靜態資料成員。原因很簡單,非靜態資料成員屬於特定的類例項,靜態成員函式主要用於對靜態資料成員的操作。
(1)靜態成員函式沒有this指標。
7、 純虛函式是怎樣實現的?在編譯原
理上講一下?
在類內部新增乙個虛函式表指標,該指標指向乙個虛函式表,該虛函式表包含了所有
的虛函式的入口位址,每個類的虛函式表都不
一樣,在執行階段可以循此脈絡找到自己的函式入口
。 純虛函式相當於佔位符, 先在虛函式表中佔乙個位置由派生類實現後再把真正的函式指標填
進去。除此之外和普通的虛函式沒什麼區別。
8、new/malloc,free/delete的區別?
delete 會呼叫物件的析構函式,和 new 對應; free 只會釋放記憶體,new 呼叫建構函式。malloc
與 free 是 c++/c 語言的標準庫函式,new/delete 是 c++的運算子。它們都可用於申請動態
記憶體和釋放記憶體。對於非內部資料型別的物件而言,光用 maloc/free 無法滿足動態物件的
要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於
malloc/free 是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和
析構函式的任務強加於 malloc/free。因此 c++語言需要乙個能完成動態記憶體分配和初始化
工作的運算子 new,以及乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete
不是庫函式。
9、tcp/ip協議:
tcp/ip(傳輸控制協議/
網間協議
)是一種
網路通訊協議
,它規範了網路上的所有通訊裝置,尤其是乙個
主機與另乙個主機之間的資料往來格式以及傳送方式。tcp/ip是internet的基礎協議,也是一種電腦資料打包和
定址的標準方法。在
資料傳送
中,可以形象地理解為有兩個信封,tcp和ip就像是信封,要傳遞的資訊被劃分成若干段,每一段塞入乙個tcp信封,並在該信封面上記錄有分段號的資訊,再將tcp信封塞入ip大信封,傳送上網。在接受端,乙個tcp軟體包收集信封,抽出資料,按傳送前的順序還原,並加以校驗,若發現差錯,tcp將會要求重發。因此,tcp/ip在internet中幾乎可以無差錯地傳送資料。 對普通使用者來說,並不需要了解網路協議的整個結構,僅需了解ip的位址格式,即可與世界各地進行
網路通訊。
tcp協議是一種面向連線,基於位元組流的傳輸層通訊協議。
tcp三次握手的過程如下:
1. 客戶端傳送syn(seq=x)報文給伺服器端,進入syn_send狀態。
2. 伺服器端收到syn報文,回應乙個syn (seq=y)ack(ack=x+1)報文,進入
syn_recv
狀態。
3. 客戶端收到伺服器端的syn報文,回應乙個ack(ack=y+1)報文,進入established狀態。
ip協議
是用於將多個包交換網路連線起來的,它在源位址和目的位址之間傳送一種稱之為資料報的東西,它還提供對資料大小的重新組裝功能,以適應不同網路對包大小的要求。
ip的責任就是把資料從源傳送到目的地。
10、socket網路程式設計:
1)、基本操作:
1、socket()函式
2、bind()函式
3、listen()、connect()函式
4、accept()函式
5、read()、write()函式等
6、close()函式
此文件持續更新中。。。
C 面試常見問題
1.引用和指標的區別 區別 1 引用不能為空,指標可以為空 2 引用必須初始化,指標不需要 3 引用初始化以後不能改變,指標可以改變初始化物件後的值 4 引用訪問物件後是直接訪問,指標訪問物件是間接訪問 5 引用大小是所引用物件的大小,指標大小是指標類本身的大小 6 引用沒有const,指標有con...
C 面試常見問題
智慧型指標的作用是管理乙個指標,因為存在以下這種情況 申請的空間在函式結束時忘記釋放,造成記憶體洩漏。使用智慧型指標可以很大程度上的避免這個問題,因為智慧型指標就是乙個類,當超出了類的作用域是,類會自動呼叫析構函式,析構函式會自動釋放資源。所以智慧型指標的作用原理就是在函式結束時自動釋放記憶體空間,...
C 常見面試問題
一 抽象與介面的區別 1,抽象 abstract 1 抽象類中可以有抽象方法,也可沒有 2 抽象方法包含實現,也可以由子類實現 3 抽象類不能被sealed修飾,只能使用abstract關鍵字 4 抽象方法不能在抽象類外部宣告 5 抽象類只能單繼承 6 可以有虛方法 virtual 在不同的繼承中,...