IT公司筆試面試題系列(七)

IT公司筆試面試題系列(七)

IT公司筆試面試題系列(七)

ows程式的入口是哪裡?寫出Windows訊息機制的流程。

Windows程式的入口是WinMain函式.訊息機制:系統將會維護一個或多個訊息佇列,所有產生的訊息都會被放入或是插入佇列中。系統會在佇列中取出每一條訊息,根據訊息的接收控制代碼而將該訊息傳送給擁有該視窗的程式的訊息迴圈。每一個執行的程式都有自己的訊息迴圈,在迴圈中得到屬於自己的訊息並根據接收視窗的控制代碼呼叫相應的視窗過程。而在沒有訊息時訊息迴圈就將控制權交給系統。

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){

;

}

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[] = “”

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 和 #include “filename.h” 有什麼區別?

答:前者用來包含開發環境提供的庫標頭檔案,後者用來包含自己編寫的標頭檔案。

(3).在C++ 程式中呼叫被 C 編譯器編譯後的函式,為什麼要加 extern “C”宣告?

答:函式和變數被C++編譯後在符號庫中的名字與C語言的不同,被extern "C"修飾的變數和函式是按照C語言方式編譯和連線的。由於編譯後的名字不同,C++程式不能直接呼叫C 函式。C++提供了一個C 連線交換指定符號extern“C”來解決這個問題。

(4). switch()中不允許的資料型別是?

答:實型

10. 回答下面的問題

(1) 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 函式會有什麼樣的結果?

答:無效的指標,輸出不確定。