c++面试试题
***************************************************
更多精彩,歡迎進入:http://shop115376623.taobao.com
***************************************************
from:http://blog.csdn.net/eddy_0825/article/details/1875597
1????????C++函數中值的傳遞方式有哪幾種?
???答:C++函數的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞。
2????????頭文件的作用是什么?
答:一、通過頭文件來調用庫功能。在很多場合,源代碼不便(或不準)向用戶公布,只要向用戶提供頭文件和二進制的庫即可。用戶只需要按照頭文件中的接口聲明來調用庫功能,而不必關心接口怎么實現的。編譯器會從庫中提取相應的代碼。
??????二、頭文件能加強類型安全檢查。如果某個接口被實現或被使用時,其方式與頭文件中的聲明不一致,編譯器就會指出錯誤,這一簡單的規則能大大減輕程序員調試、改錯的負擔。
3??內存的分配方式的分配方式有幾種?
答:一、從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量。
???二、在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
???三、從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們決定,使用非常靈活,但問題也最多。
4??實現雙向鏈表刪除一個節點P,在節點P后插入一個節點,寫出這兩個函數;
答:雙向鏈表刪除一個節點P
template<class type> void list<type>::delnode(int p)
{
?int k=1;
?listnode<type> *ptr,*t;
?ptr=first;
?????while(ptr->next!=NULL&&k!=p)
?????{
??????ptr=ptr->next;
????????k++;
???? }
??????t=ptr->next;
?????cout<<"你已經將數據項?"<<t->data<<"刪除"<<endl;
?
?????ptr->next=ptr->next->next;
???? length--;
?????delete t;
???}
在節點P后插入一個節點:
template<class type> bool list<type>::insert(type t,int p)
{
??listnode<type> *ptr;
??ptr=first;
????int k=1;
? while(ptr!=NULL&&k<p)?
??{
???ptr=ptr->next;
?? k++;
??}
? if(ptr==NULL&&k!=p)
?????return false;
??else
??{
????listnode<type> *tp;
????tp=new listnode<type>;
????tp->data=t;
????tp->next=ptr->next;
????ptr->next=tp;
????length++;?
????return true;
???}
?}
5?寫一個函數,將其中的/t都轉換成4個空格。
?? void change(char* pstr)
?? {?
????? while(*pstr++ != '/0')
????? {?
???????? if (*pstr == '/t')
???????????
????? }
??? }
6?如何定義和實現一個類的成員函數為回調函數?
??答:?把成員函數申明為static就可以了.
7????????C++里面是不是所有的動作都是main()引起的?如果不是,請舉例.
答:當然不是的.并不是所有的動作都是由main()引起的,只是編譯器是由main()開始執行的
??靜態變量和全局變量的分配早在main之前完成
內聯,模板,宏的擴展全是編譯期行為,也不是main()完成的
注:C++和main()邏輯上沒有必然的聯系
8????????C++里面如何聲明const void f(void)函數為C程序中的庫函數?
答: extern ? "C" ? void ? f(void);
所以extern "C"是強迫c++編譯器對函數名進行修飾的時候采用c命名約定。???
????這樣,在c++寫的程序中就可以使用已經用c編譯器編譯好的obj或者lib了
9???????Windows程序的入口是哪里?寫出Windows消息機制的流程.
答:入口點是WinMain函數.
?Windows消息機制的流程:
一?Windows中有一個系統消息隊列,對于每一個正在執行的Windows應用程序,系統為其建立一個“消息隊列”,即應用程序隊列,用來存放該程序可能?創建的各種窗口的消息。應用程序中含有一段稱作“消息循環”的代碼,用來從消息隊列中檢索這些消息并把它們分發到相應的窗口函數中。
二?Windows為當前執行的每個Windows程序維護一個「消息隊列」。在發生輸入事件之后,Windows將事件轉換為一個「消息」并將消息放入程序的消息隊列中。程序通過執行一塊稱之為「消息循環」的程序代碼從消息隊列中取出消息:
while(GetMessage (&msg, NULL, 0, 0))????????
{????????
??? TranslateMessage (&msg) ;????????
??? DispatchMessage (&msg) ;????????
}
TranslateMessage(&msg);?將msg結構傳給Windows,進行一些鍵盤轉換。
DispatchMessage (&msg);又將msg結構回傳給Windows。然后,Windows將該消息發送給適當的窗口消息處理程序,讓它進行處理
SendMessage()與PostMessage()之間的區別是什么?
它們兩者是用于向應用程序發送消息的。PostMessagex()將消息直接加入到應用程序的消息隊列中,不等程序返回就退出;而SendMessage()則剛好相反,應用程序處理完此消息后,它才返回
10?把一個鏈表反向填空?
????void reverse(test* head)
????{
???????test* pe = head;
???????test* ps = head->next;
???????while(ps)
???????{???
??????????pe->next = ps->next;
??????????ps->next = head;
??????????head = ps;
??????????ps = pe->next;
???????}
?????}
?11??什么函數不能成為虛函數?
構造函數
內聯函數(因為沒有函數地址,在編譯時插入,是個靜態行為)
靜態成員函數(因為:?靜態成員函數類似于全局函數,不過是屬于相應類的, ??
?????在相應類的作用域下,沒有this指針)
12?虛函數與接口的區別:?
???答::虛函數的概念:???
???虛函數是動態聯編的基礎,它是引入派生概念之后用來表現基類和派生類成員函數之間的一種關系的。虛函數在基類中定義,它也是一種成員函數,而且是非靜態成員函數。?? ??
????若一個實例方法的聲明中含有virtual修飾符,則稱該方法為虛擬方法;一個虛擬方法的實現可以由派生類取代。取代所繼承的虛擬方法的實現的過程稱為重寫(覆蓋)該方法;在一個虛擬方法調用中,該調用所涉及的那個實例的運行時類型確定了要被調用的究竟是該方法的哪一個實現。???
??虛函數的限制:???
? 1).虛函數僅適用于有繼承關系的類對象, ??所以只有類的成員函數才能說明??為虛函數. ? ??
? 2).靜態成員函數不能是虛函數. ? ??
? 3).內聯函數不能是虛函數. ? ??
? 4)構造函數不能是虛函數. ? ??
? 5).析構函數可以是虛函數. ??
? ??
??接口可以有靜態成員、嵌套類型、抽象、虛擬成員、屬性和事件。實現接口的任何類都必須提供接口中所聲明的抽象成員的定義。接口可以要求任何實現類必須實現一個或多個其他接口。???
??對接口有以下限制:?? ??
??接口可以用任何可訪問性來聲明,但接口成員必須全都具有公共可訪問性。?? ??
??不能向成員或接口自身附加安全性權限。?? ??
??接口可以定義類構造函數,但不能定義實例構造函數。?? ??
??每種語言都必須為需要成員的接口映射一個實現提供規則,因為不只一個接口可以用相同的簽名聲明成員,且這些成員可以有單獨的實現。???
??接口可以由類和結構來實現。為了指示類或結構實現了某接口,在該類或結構的基類列表中應該包含該接口的標識符。如果一個類或結構實現某接口,則它還隱式實現該接口的所有基接口。即使在類或結構的基類列表中沒有顯式列出所有基接口,也是這樣。
??
13 C++中虛函數怎么實現的?? ?
?答:?每個定義了虛函數的類都有一張虛函數表vtbl(virtual ? funtion ? table),這張表實際上是一個函數指針的數組,記錄了虛函數的入口地址。只要這個類有虛函數,不管是自己定義的還是從父類繼承過來的,那么類的每個實例——對象都一個指針vptr(virtual ? function ? table ? pointer),它指向類的虛函數表。
虛函數(多態)機制的三個條件: ??
? 1派生關系???
? 2 virtual ??屬性???
? 3指針->訪問方式??
總結
- 上一篇: iconsvg image怎么变为pat
- 下一篇: 华为支付试水!移动支付会打破支付宝、微信