常見筆試題三

1.Windows程序的入口是哪裏?寫出Windows消息機制的流程。
Windows程序的入口是WinMain函數.

Windows應用程序消息處理機制

A. 操作系統接收應用程序的窗口消息,將消息投遞到該應用程序的消息隊列中

B. 應用程序在消息循環中調用GetMessage函數從消息隊列中取出一條一條的消息,取出消息後,應用程序可以對

     消息進行一些預處理。

C. 應用程序調用DispatchMessage,將消息回傳給操作系統。

D. 系統利用WNDCLASS結構體的lpfnWndProc成員保存的窗口過程函數的指針調用窗口過程,對消息進行處理。

 

2.如何定義和實現一個類的成員函數爲回調函數?
所謂的回調函數,就是預先在系統的對函數進行註冊,讓系統知道這個函數的存在,以後,當某個事件發生時,再調用這個函數對事件進行響應。
定義一個類的成員函數時在該函數前加CALLBACK即將其定義爲回調函數,函數的實現和普通成員函數沒有區別。


3.C++裏面是不是所有的動作都是main()引起的?如果不是,請舉例。
不是,比如中斷引起的中斷處理不是直接由main()引起的,而是由外部事件引起的
在運行c++程序時,通常從main()函數開始執行。因此如果沒有main(),程序將不完整,編譯器將指出未定義main()函數。
   例外情況:在windows編程中,可以編寫一個動態連接庫(dll)模塊,這是其他windows程序可以使用的代碼。由於DLL模塊不是獨立的程序,因此不需要main().用於專用環境的程序--如機器人中的控制器芯片--可能不需要main().但常規的獨立程序都需要main().
比如全局變量的初始化,就不是由main函數引起的.但是這個初始化動作並不能爲編譯器的斷點所截斷。


4.C++裏面如何聲明const void f(void)函數爲C程序中的庫函數?
在該函數前添加extern “C”聲明。

 

5.下列哪兩個是等同的
  int b;
  A const int* a = &b;
  B const* int a = &b;
  C const int* const a = &b;
  D int const* const a = &b;
各式表示的意思分別爲:
A const int* a = &b; //*a是const,但指針a可變
B const* int a = &b; //a是const,但*a可變
C const int* const a = &b; //a和*a都是const,常量和指針的值都不能改變
D int const* const a = &b; //a和*a都是const,常量和指針的值都不能改變
因此C,D兩者是相同的。
總結個技巧:如果const位於星號的左側,則const就是用來修飾指針所指向的變量,即指針指向爲常量;如果const位於星號的右側,const就是修飾指針本身,即指針本身是常量。


6.內聯函數在編譯時是否做參數類型檢查?
做類型檢查,因爲內聯函數就是在程序編譯時,編譯器將程序中出現的內聯函數的調用表達式用內聯函數的函數體來代替。
void g(base & b){
   b.play;
  }
  void main(){
   son s;
   g(s);
   return;
  }


7.寫出判斷ABCD四個表達式的是否正確, 若正確, 寫出經過表達式中 a的值

int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
a = ?
答:C錯誤,左側不是一個有效變量,不能賦值,可改爲(++a) += a;
改後答案依次爲9,10,10,11

 

8.某32位系統下, C++程序,請計算sizeof 的值

char str[] = “www.ibegroup.com”
char *p = str ;
int n = 10;
請計算
sizeof (str ) = ?(1)
sizeof ( p ) = ?(2)
sizeof ( n ) = ?(3)
void Foo ( char str[100]){
請計算
sizeof( str ) = ?(4)
}
void *p = malloc( 100 );
請計算
sizeof ( p ) = ?(5)
答:(1)17 (2)4 (3) 4 (4)4 (5)4

 

9. 回答下面的問題

(1).頭文件中的 ifndef/define/endif 幹什麼用?預處理
答:防止頭文件被重複引用
(2). #include <filename.h>和 #include “filename.h” 有什麼區別
答:前者用來包含開發環境提供的庫頭文件,後者用來包含自己編寫的頭文件。

編譯器看到“”首先是從本地目錄開始尋找,找不到了然後去尋找系統路徑;<>永遠也不會搜索本地目錄的

(3).在C++ 程序中調用被 C 編譯器編譯後的函數,爲什麼要加 extern “C”聲明?
答:函數和變量被C++編譯後在符號庫中的名字與C語言的不同,被extern "C"修飾的變量和函數是按照C語言方式編譯和連接的。由於編譯後的名字不同,C++程序不能直接調用C 函數。C++提供了一個C 連接交換指定符號extern“C”來解決這個問題。
(4). switch()中不允許的數據類型是?
答:實型


10. 回答下面的問題

(1).Void GetMemory(char **p, int num){
*p = (char *)malloc(num);
}
void Test(void){
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
請問運行Test 函數會有什麼樣的結果?
答:輸出“hello”


(2). void Test(void){
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL){
strcpy(str, “world”);
printf(str);
}
}
請問運行Test 函數會有什麼樣的結果?
答:輸出“world”


(3). char *GetMemory(void){
char p[] = "hello world";
return p;
}
void Test(void){
char *str = NULL;
str = GetMemory();
printf(str);
}
請問運行Test 函數會有什麼樣的結果?
答:無效的指針,輸出不確定。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章