1.在c++ 程式中呼叫被c 編譯器編譯後的函式,為什麼要加extern 「c」?
答:首先,extern是c/c++語言中表明函式和全域性變數作用範圍的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。
通常,在模組的標頭檔案中對本模組提供給其它模組引用的函式和全域性變數以關鍵字extern宣告。extern "c"是連線申明(linkage declaration),被extern "c"修飾的變數和函式是按照c語言方式編譯和連線的。作為一種物件導向的語言,c++支援函式過載,而過程式語言c則不支援。
函式被c++編譯後在符號庫中的名字與c語言的不同。例如,假設某個函式的原型為:void foo( int x, int y );該函式被c編譯器編譯後在符號庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。
這樣的名字包含了函式名、函式引數數量及型別資訊,c++就是靠這種機制來實現函式過載的。
所以,可以用一句話概括extern 「c」這個宣告的真實目的:解決名字匹配問題,實現c++與c的混合程式設計。
2.標頭檔案中的ifndef/define/endif有什麼作用?
答:這是c++預編譯標頭檔案保護符,保證即使檔案被多次包含,標頭檔案也只定義一次。
3. #include 與 #include "file.h"的區別?
答:前者是從標準庫路徑尋找和引用file.h,而後者是從當前工作路徑搜尋並引用file.h。
4.評價一下c/c++各自的特點
答:c語言是一種結構化語言,面向過程,基於演算法和資料結構,所考慮的是如何通過乙個過程或者函式從輸入得到輸出;
c++是物件導向,基於類、物件和繼承,所考慮的是如何構造乙個物件模型,讓這個模型能夠契合與之對應的問題,通過獲取物件的狀態資訊得到輸出或實現過程控制。
5.const 有什麼用途?
答:在c/c++中,(1)可以定義const常量,(2)修飾函式的返回值和形參;
在c++中,還可以修飾函式的定義體,定義類的const成員函式。被const修飾的東西受到強制保護,可以預防意外的變動,提高了程式的健壯性。
6.const和#define有什麼區別?
答:(1)const和#define都可以定義常量,但是const用途更廣。
(2)const 常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤。
(3) 有些整合化的除錯工具可以對const 常量進行除錯,但是不能對巨集常量進行除錯。
7.關於sizeof小結的。
答:sizeof計算的是在棧中分配的記憶體大小。
(1) sizeof不計算static變數占得記憶體;
(2) 指標的大小一定是4個位元組,而不管是什麼型別的指標;
(3) char型佔1個位元組,int佔4個位元組,short int佔2個位元組
long int佔4個位元組,float佔4位元組,double佔48位元組,string佔4位元組
乙個空類佔1個位元組,單一繼承的空類佔1個位元組,虛繼承涉及到虛指標所以佔4個位元組
(4) 陣列的長度:
若指定了陣列長度,則不看元素個數,總位元組數=陣列長度*sizeof(元素型別)
若沒有指定長度,則按實際元素個數類確定
ps:若是字元陣列,則應考慮末尾的空字元。
(5) 結構體物件的長度
在預設情況下,為方便對結構體內元素的訪問和管理,當結構體內元素長度小於處理器位數的時候,便以結構體內最長的資料元素的長度為對齊單位,即為其整數倍。若結構體內元素長度大於處理器位數則以處理器位數為單位對齊。
(6) unsigned影響的只是最高位的意義,資料長度不會改變,所以sizeof(unsigned int)=4
(7) 自定義型別的sizeof取值等於它的型別原型取sizeof
(8) 對函式使用sizeof,在編譯階段會被函式的返回值的型別代替
(9) sizeof後如果是型別名則必須加括號,如果是變數名可以不加括號,這是因為sizeof是運算子
(10) 當使用結構型別或者變數時,sizeof返回實際的大小。當使用靜態陣列時返回陣列的全部大小,sizeof不能返回動態陣列或者外部陣列的尺寸
8.sizeof與strlen的區別?
答: (1)sizeof的返回值型別為size_t(unsigned int);
(2)sizeof是運算子,而strlen是函式;
(3)sizeof可以用型別做引數,其引數可以是任意型別的或者是變數、函式,而strlen只能用char*做引數,且必須是以』\0』結尾;
(4)陣列作sizeof的引數時不會退化為指標,而傳遞給strlen是就退化為指標;
(5)sizeo是編譯時的常量,而strlen要到執行時才會計算出來,且是字串中字元的個數而不是記憶體大小;
9.指標和引用的區別?
答:指標和引用都提供了間接操作物件的功能。
(1) 指標定義時可以不初始化,而引用在定義時就要初始化,和乙個物件繫結,而且一經繫結,只要引用存在,就會一直保持和該物件的繫結;
(2) 賦值行為的差異:指標賦值是將指標重新指向另外乙個物件,而引用賦值則是修改物件本身;
(3) 指標之間存在型別轉換,而引用分const引用和非const應用,非const引用只能和同型別的物件繫結,const引用可以繫結到不同但相關型別的物件或者右值
10.陣列和指標的區別?
答:(1)陣列要麼在全域性資料區被建立,要麼在棧上被建立;指標可以隨時指向任意型別的記憶體塊;
(2)修改內容上的差別:
char a = 「hello」;
a[0] = 『x』;
char *p = 「world」; // 注意p 指向常量字串
p[0] = 『x』; // 編譯器不能發現該錯誤,執行時錯誤
(3)用運算子sizeof 可以計算出陣列的容量(位元組數)。sizeof(p),p 為指標得到的是乙個指標變數的位元組數,而不是p 所指的記憶體容量。c++/c 語言沒有辦法知道指標所指的記憶體容量,除非在申請記憶體時記住它。
注意當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。
11.空指標和懸垂指標的區別?
答:空指標是指被賦值為null的指標;delete指向動態分配物件的指標將會產生懸垂指標。
(1) 空指標可以被多次delete,而懸垂指標再次刪除時程式會變得非常不穩定;
(2) 使用空指標和懸垂指標都是非法的,而且有可能造成程式崩潰,如果指標是空指標,儘管同樣是崩潰,但和懸垂指標相比是一種可預料的崩潰。
12.c++中有malloc/free,為什麼還有new/delete?
答:malloc/free是c/c++標準庫函式,new/delete是c++運算子。他們都可以用於動態申請和釋放記憶體。
對於內建型別資料而言,二者沒有多大區別。malloc申請記憶體的時候要制定分配記憶體的位元組數,而且不會做初始化;new申請的時候有預設的初始化,同時可以指定初始化;
對於類型別的物件而言,用malloc/free無法滿足要求的。物件在建立的時候要自動執行建構函式,消亡之前要呼叫析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制之內,不能把執行建構函式和析構函式的任務強加給它,因此,c++還需要new/delete。
13.什麼是智慧型指標?
答:當類中有指標成員時,一般有兩種方式來管理指標成員:一是採用值型的方式管理,每個類物件都保留乙份指標指向的物件的拷貝;另一種更優雅的方式是使用智慧型指標,從而實現指標指向的物件的共享。
智慧型指標的一種通用實現技術是使用引用計數。智慧型指標類將乙個計數器與類指向的物件相關聯,引用計數跟蹤該類有多少個物件共享同一指標。
每次建立類的新物件時,初始化指標並將引用計數置為1;當物件作為另一物件的副本而建立時,拷貝建構函式拷貝指標並增加與之相應的引用計數;對乙個物件進行賦值時,賦值操作符減少左運算元所指物件的引用計數(如果引用計數為減至0,則刪除物件),並增加右運算元所指物件的引用計數;呼叫析構函式時,建構函式減少引用計數(如果引用計數減至0,則刪除基礎物件)。
14.物件導向技術的基本概念是什麼,三個基本特徵是什麼?
答:基本概念:類、物件、繼承; 基本特徵:封裝、繼承、多型。
封裝:將低層次的元素組合起來形成新的、更高實體的技術;
繼承:廣義的繼承有三種實現形式:實現繼承、可視繼承、介面繼承。
多型:允許將子類型別的指標賦值給父類型別的指標
15.c++空類預設有哪些成員函式?
答:預設建構函式、析構函式、複製建構函式、賦值函式
16.哪一種成員變數可以在乙個類的例項之間共享?
答:static靜態成員變數
17.繼承層次中,為什麼基類析構函式是虛函式?
答:編譯器總是根據型別來呼叫類成員函式。但是乙個派生類的指標可以安全地轉化為乙個基類的指標。
這樣刪除乙個基類的指標的時候,c++不管這個指標指向乙個基類物件還是乙個派生類的物件,呼叫的都是基類的析構函式而不是派生類的。如果你依賴於派生類的析構函式的**來釋放資源,而沒有過載析構函式,那麼會有資源洩漏。
18.為什麼建構函式不能為虛函式?
答:虛函式採用一種虛呼叫的方法。需呼叫是一種可以在只有部分資訊的情況下工作的機制。如果建立乙個物件,則需要知道物件的準確型別,因此建構函式不能為虛函式。
19.如果虛函式是有效的,那為什麼不把所有函式設為虛函式?
答:不行。首先,虛函式是有代價的,由於每個虛函式的物件都要維護乙個虛函式表,因此在使用虛函式的時候都會產生一定的系統開銷,這是沒有必要的。
20.建構函式可以是內聯函式
21.什麼是多型?多型有什麼作用?
面試問答題
回答樣本一 我對工資沒有硬性要求,我相信貴公司在處理我的問題上會友善合理。我注重的是找對工作機會,所以只要條件公平,我則不會計較太多。回答樣本二 我受過系統的軟體程式設計的訓練,不需要進行大量的培訓,而且我本人也對程式設計特別感興趣。因此,我希望公司能根據我的情況和市場標準的水平,給我合理的薪水。回...
模擬面試問答題
1 請介紹一下你自己。這是外企常問的問題。一般人回答這個問題過於平常,只說姓名 年齡 愛好 工作經驗,這些在簡歷上都有,其實,外企最希望知道的是求職者能否勝任工作,包括 最強的技能 最深入研究的知識領域 個性中最積極的部分 做過的最成功的事,主要的成就等,這些都可以和學習無關,也可以和學習有關,但要...
複試面試的問答題
第一部分 自動控制原理 一 是開環控制什麼是閉環控制?開環控制系統 open loop control system 是指被控物件的輸出 被控制量 對控制器的輸出沒有影響。在這種控制系統中,不依賴將被控量反送回來以形成任何閉環迴路。閉環控制系統 closed loop control system ...