c語言筆試試題

2023-01-27 21:06:05 字數 4546 閱讀 5313

關係 , , , delete 會呼叫物件的析構函式,和 new 對應 ;free 只會釋放記憶體, 呼叫建構函式. new malloc 與 free 是 c++/c 語言的標準庫函式,new/delete 是 c++的運算子.它們都可用於申請動態記憶體和釋放記憶體.

對於非內部資料型別的物件而言, 光用 malloc/free 無法滿足動態物件的要求. 物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式.

由於 malloc/free 是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於 malloc/free. 因此 c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子 new,以及乙個能完成清理與釋放記憶體工作的運算子 delete.注意 new/delete 不是庫函式

與 delete 區別區別 delete 只會呼叫一次析構函式,而 delete會呼叫每乙個成員的析構函式.在 more effective c++中有更為詳細的解釋: "當 delete 操作符用於陣列時,它為每個陣列元素呼叫析構函式,然後呼叫 operatordelete 來釋放記憶體.

"delete 與 new 配套,delete 與 new 配套 memtest*mtest1=newmemtest[10]; memtest*mtest2=newmemtest; int*pint1=newint[10]; int*pint2=newint; deletepint1; //-1deletepint2; //-2deletemtest1;//-3deletemtest2;//-4在-4-處報錯. 這就說明:對於內建簡單資料型別,delete 和 delete功能是相同的.

對於自定義的複雜資料型別, delete 和 delete不能互用.delete刪除乙個陣列,delete 刪除乙個指標簡單來說, 用 new 分配的記憶體用 delete 刪除用 new分配的記憶體用 delete刪除 delete會呼叫陣列元素的析構函式.內部資料型別沒有析構函式,所以問題不大.

如果你在用 delete 時沒用括號, delete 就會認為指向的是單個物件,否則,它就會認為指向的是乙個陣列.

c++ j**a 共同點,不同之處? 共同點,不同之處?

4.繼承優缺點. 繼承優缺點.

繼承優缺點類繼承是在編譯時刻靜態定義的, 且可直接使用, 類繼承可以較方便地改變父類的實現. 但是類繼承也有一些不足之處.首先,因為繼承在編譯時刻就定義了,所以無法在執行時刻改變從父類繼承的實現.

更糟的是,父類通常至少定義了子類的部分行為,父類的任何改變都可能影響子類的行為. 如果繼承下來的實現不適合解決新的問題, 則父類必須重寫或被其他更適合的類替換.這種依賴關係限制了靈活性並最終限制了復用性.

(待補充)

有哪些性質(物件導向特點) 有哪些性質(物件導向特點) 有哪些性質封裝,繼承和多型. 在物件導向程式設計語言中, 封裝是利用可重用成分構造軟體系統的特性, 它不僅支援系統的可重用性, 而且還有利於提高系統的可擴充性; 訊息傳遞可以實現傳送乙個通用的訊息而呼叫不同的方法;封裝是實現資訊隱蔽的一種技術,其目的是使類的定義和實現分離.

6.子類析構時要呼叫父類的析構函式嗎?

析構函式呼叫的次序是先派生類的析構後基類的析構, 也就是說在基類的的析構呼叫的時候,派生類的資訊已經全部銷毀了。定義乙個物件時先呼叫基類的建構函式,然後呼叫派生類的建構函式;析構的時候恰好相反:先呼叫派生類的析構函式,然後呼叫基類的析構函式 j**a 無析構函式深拷貝和淺拷貝

7.多型,虛函式,純虛函式多型,虛函式, 多型

8.求下面函式的返回值(微軟) 求下面函式的返回值(微軟) 求下面函式的返回值 int func(x)

return countx;

} 假定 x = 9999. 答案:8 思路:將 x 轉化為 2 進製,看含有的 1 的個數.

9.什麼是引用 ?申明和使用引用要注意哪些問題?

答:引用就是某個目標變數的"別名"(alias),對應用的操作與對變數直接操作效果完全相同.申明乙個引用的時候,切記要對其進行初始化.

引用宣告完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,不能再把該引用名作為其他變數名的別名.宣告乙個引用,不是新定義了乙個變數,它只表示該引用名是目標變數名的乙個別名,它本身不是一種資料型別,因此引用本身不佔儲存單元,系統也不給引用分配儲存單元.不能建立陣列的引用.

10.將"引用作為函式引數有哪些特點?

引用"作為函式引數有哪些特點

(1)傳遞引用給函式與傳遞指標的效果是一樣的.這時,被調函式的形參就成為原來主調函式中的實參變數或物件的乙個別名來使用, 所以在被調函式中對形參變數的操作就是對其相應的目標物件(在主調函式中)的操作.

(2)使用引用傳遞函式的引數,在記憶體中並沒有產生實參的副本,它是直接對實參操作;而使用一般變數傳遞函式的引數,當發生函式呼叫時,需要給形參分配儲存單元,形參變數是實參變數的副本;如果傳遞的是物件,還將呼叫拷貝建構函式.因此,當引數傳遞的資料較大時,用引用比用一般變數傳遞引數的效率和所佔空間都好.

(3)使用指標作為函式的引數雖然也能達到與使用引用的效果,但是,在被調函式中同樣要給形參分配儲存單元,且需要重複使用"*指標變數名"的形式進行運算,這很容易產生錯誤且程式的閱讀性較差;另一方面,在主調函式的呼叫點處,必須用變數的位址作為實參.而引用更容易使用,更清晰.

11.在什麼時候需要使用常引用 ? 如果既要利用引用提高程式的效率, 又要保護傳遞給函式的資料不在函式中被改變, 就應使用常引用.

常引用宣告方式:const 型別識別符號 &引用名=目標變數名;

例1 int a ; const int &ra=a; ra=1; //錯誤 a=1; //正確

例2 string foo( ); void bar(string & s);

那麼下面的表示式將是非法的: bar(foo( )); bar("hello world");

原因在於 foo( )和"hello world"串都會產生乙個臨時物件, 而在 c++中, 這些臨時物件都是 const 型別的.因此上面的表示式就是試圖將乙個 const 型別的物件轉換為非 const 型別, 這是非法的.引用型引數應該在能被定義為 const 的情況下,盡量定義為 const .

12.將"引用作為函式返回值型別的格式,好處和需要遵守的規則

引用"作為函式返回值型別的格式格式:型別識別符號 &函式名(形參列表及型別說明)

好處:在記憶體中不產生被返回值的副本; (注意:正是因為這點原因,所以返回乙個區域性變數的引用是不可取的.

因為隨著該區域性變數生存期的結束,相應的引用也會失效,產生 runtime error! 注意事項:

(1)不能返回區域性變數的引用.這條可以參照 effective c++[1]的 item 31.主要原因是區域性變數會在函式返回後被銷毀,因此被返回的引用就成為了"無所指"的引用,程式會進入未知狀態.

(2)不能返回函式內部 new 分配的記憶體的引用.這條可以參照 effective c++[1]的 item 31.雖然不存在區域性變數的被動銷毀問題,可對於這種情況(返回函式內部 new 分配記憶體的引用) ,又面臨其它尷尬局面.

例如,被函式返回的引用只是作為乙個臨時變數出現,而沒有被賦予乙個實際的變數,那麼這個引用所指向的空間(由 new 分配)就無法釋放,造成 memory leak.

(3) 可以返回類成員的引用, 但最好是 const. 這條原則可以參照 effective c++[1]的 item 30.主要原因是當物件的屬性是與某種業務規則(business rule)相關聯的時候,其賦值常常與某些其它屬性或者物件的狀態有關,因此有必要將賦值操作封裝在乙個業務規則當中.

如果其它物件可以獲得該屬性的非常量引用(或指標) ,那麼對該屬性的單純賦值就會破壞業務規則的完整性.

(4)流操作符過載返回值申明為"引用"的作用: 流操作符《和》,這兩個操作符常常希望被連續使用,例如:cout << "hello" << endl; 因此這兩個操作符的返回值應該是乙個仍然支援這兩個操作符的流引用.

可選的其它方案包括:返回乙個流物件和返回乙個流物件指標.但是對於返回乙個流物件,程式必須重新(拷貝)構造乙個新的流物件,也就是說,連續的兩個《操作符實際上是針對不同物件的!

這無法讓人接受.對於返回乙個流指標則不能連續使用《操作符.因此,返回乙個流物件引用是惟一選擇.

這個唯一選擇很關鍵,它說明了引用的重要性以及無可替代性,也許這就是 c++語言中引入引用這個概念的原因吧. 賦值操作符=.這個操作符象流操作符一樣,是可以連續使用的,例如:

x = j = 10;或者(x=10)=100;賦值操作符的返回值必須是乙個左值,以便可以被繼續賦值.因此引用成了這個操作符的惟一返回值選擇.

例3 #include <>

int &put(int n);

int vals[10];

int error=-1;

void main()

} (5)在另外的一些操作符中,卻千萬不能返回引用:+-*/ 四則運算符.它們不能返回引用, effective c++[1]的 item23 詳細的討論了這個問題.

主要原因是這四個操作符沒有 side effect,因此,它們必須構造乙個物件作為返回值,可選的方案包括:返回乙個物件,返回乙個區域性變數的引用,返回乙個 new 分配的物件的引用,返回乙個靜態物件引用.根據前面提到的引用作為返回值的三個規則,第 2,3 兩個方案都被否決了.

靜態物件的引用又因為((a+b) == (c+d))會永遠為 true 而導致錯誤.所以可選的只剩下返回乙個物件了.

C語言筆試題

c語言筆試題.txt 太多,傻子明顯不夠用了。我就是在路上斬棘殺龍遊江過河攀上塔頂負責吻醒你的公主。現在的公司招聘,都要筆試面試.如果你不是那種程式設計功底非常深厚的人,又不好好準備一番,在筆試面試中往往會處於被動局面.雖然有些筆試題是故意為難我們,有點鑽牛角尖.但是很多筆試題面試題確實能夠很好地看...

c語言考試試題

六一 判斷共10題 共計20分 第1題 2.0分 題號 1259 若定義int m 則m 1 的值為2.答案 y 第2題 2.0分 題號 1275 如果定義乙個函式時省略型別,則函式沒有返回值.答案 n 第3題 2.0分 題號 12 結構體型別只有一種。答案 n 第4題 2.0分 題號 1241 在...

C語言考試試題

2011 2012學年第二學期 c程式語言 課程考試卷 a卷 專業 資訊管理與資訊系統層次 本科年級 2011 試卷總分 100分,考試時間 120分鐘,試題內容7頁,空白紙0頁 客觀題部分 一 選擇題 每題1分,共20題,共20分 1 以下選項中屬於c語言的資料型別是 d a 複數型 b 邏輯型 ...