程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++面試試題0002

C++面試試題0002

編輯:C++入門知識

1.        C++中為什麼用模板類? (1)可用來創建動態增長和減小的數據結構。 (2)它是類型無關的,因此具有很高的可復用性。 (3)它在編譯時而不是運行時檢查數據類型,保證了類型安全。 (4)它是平台無關的,可移植性。 (5)可用於基本數據類型 。   2.        求函數返回值,輸入x=9999; int func ( x ) { int countx = 0; while ( x ) { countx ++; x = x&(x-1); } return countx; } 結果呢? 知道了這是統計9999的二進制數值中有多少個1的函數,且有 9999=9×1024+512+256+15   9×1024中含有1的個數為2; 512中含有1的個數為1; 256中含有1的個數為1; 15中含有1的個數為4; 故共有1的個數為8,結果為8。 1000 - 1 = 0111,正好是原數取反。這就是原理。 用這種方法來求1的個數是很效率很高的。 不必去一個一個地移位。循環次數最少。   3.        C++的重載(overload)與重寫(override)的區別? 成員函數被重載的特征: (1)相同的范圍(在同一個類中); (2)函數名字相同; (3)參數不同; (4)virtual關鍵字可有可無。   重寫是指派生類函數重寫基類函數,是C++的多態的表現,特征是: (1)不同的范圍(分別位於派生類與基類); (2)函數名字相同; (3)參數相同; (4)基類函數必須有virtual關鍵字。 4.        MFC中SendMessage和PostMessage的區別? PostMessage 和SendMessage的區別主要在於是否等待應用程序做出消息處理。PostMessage只是把消息放入隊列,然後繼續執行;而SendMessage必須等待應用程序處理消息後才返回繼續執行。這兩個函數的返回值也不同,PostMessage的返回值表示PostMessage函數執行是否正確,而SendMessage的返回值表示其他程序處理消息後的返回值。   5.        Programming (Mandatory) Linked list a. Implement a linked list forintegers,which supports the insertafter (insert a node after a specified node)and removeafter (remove the node after a specified node) methods; b. Implement a method to sort the linkedlist to descending order. 答:題目的意思是實現一個整型鏈表,支持插入,刪除操作(有特殊要求,都是在指定節點後進行操作),並寫一個對鏈表數據進行降序排序的方法。 那我們不妨以一個線性鏈表進行編程。 // 單鏈表結構體為 typedef struct LNode { int data; struct LNode *next; }LNode, *pLinkList;   // 單鏈表類 class LinkList { private: pLinkList m_pList; int m_listLength; public: LinkList(); ~LinkList(); bool InsertAfter(int afternode, int data);//插入 bool RemoveAfter(int removenode);//刪除 void sort();//排序 };   實現方法 //insert a node after a specified node bool LinkList::InsertAfter(int afternode,int data) { LNode *pTemp = m_pList; int curPos = -1; if (afternode > m_listLength ) // 插入點超過總長度 { return false; } while (pTemp != NULL) // 找到指定的節點 { curPos++; if (curPos == afternode) break; pTemp = pTemp->next; } if (curPos != afternode) // 節點未尋到,錯誤退出 { return false; } LNode *newNode = new LNode; // 將新節點插入指定節點後 newNode->data = data; newNode->next = pTemp->next; pTemp->next = newNode; m_listLength++; return true; }   //remove the node after a specified node bool LinkList::RemoveAfter(int removenode) { LNode *pTemp = m_pList; int curPos=-1; if (removenode > m_listLength) // 刪除點超過總長度 { return false; }   // 找到指定的節點後一個節點,因為刪除的是後一個節點 while (pTemp != NULL) { curPos++; if (curPos == removenode+1) break; pTemp = pTemp->next; } if (curPos != removenode) // 節點未尋到,錯誤退出 { return false; } LNode *pDel = NULL; // 刪除節點 pDel = pTemp->next; pTemp->next = pDel->next; delete pDel; m_listLength–; return true; }   //sort the linked list to descending order. void LinkList::sort() { if (m_listLength<=1) { return; } LNode *pTemp = m_pList; int temp; // 選擇法排序 for(int i=0;i<M_LISTLENGTH-1;I++) for(int j=i+1;j<M_LISTLENGTH;J++) if (pTemp[i].data<PTEMP[J].DATA) { temp=pTemp[i].data; pTemp[i].data=pTemp[j].data; pTemp[j].data=temp; } } 前兩個函數實現了要求a,後一個函數sort()實現了要求b   6.        Windows程序的入口是哪裡?寫出Windows消息機制的流程。 Windows程序的入口是WinMain函數 消息機制:系統將會維護一個或多個消息隊列,所有產生的消息都會被放入或是插入隊列中。系統會在隊列中取出每一條消息,根據消息的接收句柄而將該消息發送給擁有該窗口的程序的消息循環。每一個運行的程序都有自己的消息循環,在循環中得到屬於自己的消息並根據接收窗口的句柄調用相應的窗口過程。而在沒有消息時消息循環就將控制權交給系統。   7.        如何定義和實現一個類的成員函數為回調函數? 所謂的回調函數,就是預先在系統的對函數進行注冊,讓系統知道這個函數的存在,以後,當某個事件發生時,再調用這個函數對事件進行響應。 定義一個類的成員函數時在該函數前加CALLBACK即將其定義為回調函數,函數的實現和普通成員函數沒有區別。 8.        請問交換機和路由器各自的實現原理是什麼?分別在哪個層次上面實現的? 交換機屬於OSI第二層即數據鏈路層設備。它根據MAC地址尋址,通過站表選擇路由,站表的建立和維護由交換機自動進行。路由器屬於OSI第三層即網絡層設備,它根據IP地址進行尋址,通過路由表路由協議產生。交換機最大的好處是快速,路由器最大的好處是控制能力強。 9.        全局變量和局部變量有什麼區別?是怎麼實現的?操作系統和編譯器是怎麼知道的? 一些變量在整個程序中都是可見的,它們稱為全局變量。一些變量只能在一個函數中可知,稱為局部變量。這就是他們的區別。 在任何函數外面定義的變量就是全局變量,在函數內部定義的變量是局部變量,這是它們在程序中的實現過程。 操作系統和編譯器是根據程序運行的內存區域知道他們的,程序的全局數據放在所分配內存的全局數據區,程序的局部數據放在棧區。 10.     C++:memset ,memcpy 和strcpy 的根本區別? #include “memory.h” memset用來對一段內存空間全部設置為某個字符,一般用在對定義的字符串進行初始化為‘‘或‘\0′;例:char a[100];memset(a, ‘\0′, sizeof(a)); memcpy用來做內存拷貝,你可以拿它拷貝任何數據類型的對象,可以指定拷貝的數據長度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),會造成b的內存地址溢出。   strcpy就只能拷貝字符串了,它遇到’\0′就結束拷貝;例:chara[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串長度(第一個‘\0′之前)是否超過50位,如超過,則會造成b的內存地址溢出。 11.     ASSERT()是干什麼用的? ASSERT() 是一個調試程序時經常使用的宏,在程序運行時它計算括號內的表達式,如果表達式為FALSE (0), 程序將報告錯誤,並終止執行。如果表達式不為0,則繼續執行後面的語句。這個宏通常原來判斷程序中是否出現了明顯非法的數據,如果出現了終止程序以免導致嚴重後果,同時也便於查找錯誤。 12.     二分查找算法實現。 1、遞歸方法實現: int BSearch(elemtype a[],elemtype x,intlow,int high) /*在下屆為low,上界為high的數組a中折半查找數據元素x*/ { int mid; if(low>high) return -1; mid=(low+high)/2; if(x==a[mid]) return mid; if(x<a[mid]) return(BSearch(a,x,low,mid-1)); else return(BSearch(a,x,mid+1,high)); }   2、非遞歸方法實現: int BSearch(elemtype a[],keytype key,int n) { int low,high,mid; low=0;high=n-1; while(low<=high) { mid=(low+high)/2; if(a[mid].key==key) return mid; else if(a[mid].key<key) low=mid+1; else high=mid-1; } return -1; }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved