騰訊 2021年 pc客戶端開發面試題

小編:管理員 1376閱讀 2021.06.18

第1題:


一、不定項選擇題

下列說法錯誤的有( )            

A、在類方法中可用this來調用本類的類方法

B、在類方法中調用本類的類方法時可直接調用

C、在類方法中只能調用本類中的類方法

D、在類方法中絕對不能調用實例方法

 



答案:A C D

解析:

A:類方法是指類中被static修飾的方法,無this指針。

C:類方法是可以調用其他類的static方法的。

D:可以在類方法中生成實例對象再調用實例方法。(這個我也打錯了,想想應該是這個意思)

 


第2題:


 下列運算符,在C++語言中不能重載的是()          

A、*

B、.*

C、::

D、operator  delete



答案: BC

解析:并不是所有的操作符都能被重載。除了   .    ,   .*    ,   ::    ,   ? :    ,   sizeof   ,   typeid   這幾個運算符不能被重載,其他運算符都能被重載。

.表示成員選擇

.*表示指向成員操作的指針

?=表示條件操作 expr?expr:expr



第3題:


 下列的模板說明中,正確的有(  )    

A、template <typename T1, typename T2>

B、template <class T1, T2>

C、template <class T1, class T2>

D、template <typename T1; typename T2>



答案:AC

解析:

D的分號是錯的;
B的參數T2前加class 或者typename



第4題:


 In C++, which of the following keyword(s) can be used on both a variable and a function?       

A、static

B、virtual

C、extern

D、inline

E、const



答案:A C E



第5題:


 Which of the following statement(s) equal(s) value 1 in C programming language? 

A、the return value of main function if program ends normally

B、return (7&1)

C、char *str="microsoft"; return str=="microsoft"

D、return "microsoft"=="microsoft"

E、None of the above

答案: BCD  

解析:A.main成功返回,是0   B. 按位與 7&1 = 111 & 001 = 001  即 1  C.str這個指針就是指向"microsoft"這個字符串常量的地址,所以,str == "microsoft" 自然是成立的, D. 兩個相同的字符串常量是放在同一個內存地址的,所以也相等,  答案為BCD



第6題:


 下列定義語句中,錯誤的是

A int px*;

B char*acp[10];

C char(*pac)[10];

D int(*p)();



答案: A



第7題:


 抽象基類是指( ) 

A 嵌套類

B 派生類

C 含有純虛函數

D 多繼承類



 答案:C

【解析】抽象基類是指含有純虛函數,不能夠實例化的基類。



第8題:


 給出以下定義,下列哪些操作是合法的?
 

const char *p1 = “hello”;

char *const p2 = “world”;

         

A p1++;

B p1[2] = ‘w’;

C p2[2] = ‘l’;

D p2++;



答案:A

解析:

p1是指向字符常量的指針,p1本身不是常量,所以p1++合法,A正確。

p2本身是指針常量,可以指向非常量的字符。但是"hello"這樣聲明的字符串是存儲在只讀存儲區的,不可修改,所以B,C,D都錯誤。



第9題:


 關于IP地址下列說法錯誤的是?

A IP地址采用分層結構,它由網絡號與主機號兩部分組成

B 根據不同的取值范圍IP地址可以分為五類

C 202.112.139.140屬于B類地址

D 每個C類網絡最多包含254臺主機

E IPv6采用128位地址長度

F 私有地址只是ABC類地址的一部分



答案:C

解析:

最初設計互聯網絡時,為了便于尋址以及層次化構造網絡,IP地址采用分層結構,每個IP地址包括兩個標識碼(ID),即網絡ID和主機ID。同一個物理網絡上的所有主機都使用同一個網絡ID,網絡上的一個主機(包括網絡上工作站,服務器和路由器等)有一個主機ID與其對應。IP地址根據網絡ID的不同分為5種類型,A類地址、B類地址、C類地址、D類地址和E類地址。 

1. A類IP地址 
一個A類IP地址由1字節的網絡地址和3字節主機地址組成,網絡地址的最高位必須是“0”, 地址范圍從1.0.0.0     到126.0.0.0?捎玫腁類網絡有126個,每個網絡能容納1億多個主機。 
2. B類IP地址 
一個B類IP地址由2個字節的網絡地址和2個字節的主機地址組成,網絡地址的最高位必須是“10”,地址范圍從128.0.0.0到191.255.255.255?捎玫腂類網絡有16382個,每個網絡能容納6萬多個主機    。 
3. C類IP地址 
一個C類IP地址由3字節的網絡地址和1字節的主機地址組成,網絡地址的最高位必須是“110”。范圍從192.0.0.0到223.255.255.255。C類網絡可達209萬余個,每個網絡能容納254個主機。 
4. D類地址用于多點廣播(Multicast)。 
D類IP地址第一個字節以“lll0”開始,它是一個專門保留的地址。它并不指向特定的網絡,目前這一類地址被用在多點廣播(Multicast)中。多點廣播地址用來一次尋址一組計算機,它標識共享同一協議的一組計算機。 
5. E類IP地址 
以“llll0”開始,為將來使用保留。 

在IP地址3種主要類型里,各保留了3個區域作為私有地址,其地址范圍如下: 
A類地址:10.0.0.0~10.255.255.255 
   B類地址:172.16.0.0~172.31.255.255 
C類地址:192.168.0.0~192.168.255.255

另外IPv6地址長度為128位,是IETF(互聯網工程任務組,Internet Engineering Task    Force)設計的用于替代現行版本IP協議(IPv4)的下一代IP協議。



第10題:


 對于二分查找算法下面描述正確的是哪個?

A 只能用于數組

B 只能用于鏈表

C 只能在已經排序的數據上進行查找

D 最壞情況下時間復雜度是O(N*logN)



答案: A,C

錯誤分析:

B:鏈表不支持隨機訪問.

D:最壞情況下時間復雜度是 O(logN).



第11題:


 用來檢查到一臺主機的網絡層是否連通命令是( )?

A PING

B TRACERT

C TELNET

D IPCONFIG



答案:A

解析:
ping命令通過發送ICMP數據包檢測網絡層是否連通
tracert是用來跟蹤路由的命令
telnet命令式通過telnet協議和另一主機相聯。
ipconfig是查看ip地址信息



第12題:


 類B從類A派生,則類B可以訪問類A中的( )成員?

A public成員

B private成員

C protected成員

D 數據成員

E 函數成員



答案:AC

解析:private成員只能在當前類中訪問,派生類可以訪問父類的public和protected屬性成員



第13題:


 路由器轉發數據包到非直接網段的過程中,依靠下列哪一個選項來尋找下一跳地址( )      

A 幀頭

B IP報文頭部

C SSAP子段

D DSAP子段



答案:B

解析:

路由器工作在OSI的網絡層,轉發的數據包是IP報文。

IP報文的頭部有源IP和目的IP

路由器根據目的ip計算出iP所在的網段,根據網段轉發到不同的端口。

如果在路由表中沒有該網段的轉發端口,則轉發至默認路由端口



第14題:


 IPv6地址占____個字節          

A 4

B 6

C 8

D 16



答案:D

解析:IPv6二進位制下為128位(16字節)長度,以16位為一組,每組以冒號":"隔開,可以分為8組,每組以4位十六進制方式表示。



第15題:


 以下說法正確的是:

A 在并行程度中,當兩個并行的線程,在沒有任何約束的情況下,訪問一個共享變量或者共享對象的一個域,而且至少要有一個操作是寫操作,就可能發生數據競爭錯誤。

B 原語Compare-and-swap(CAS)是實現無鎖數據結構的通用原語。

C 獲得內部鎖的唯一途徑是:進入這個內部鎖保護的同步塊或方法。

D volatile變量具有synchronized的可見性特性,但是不具備原子特性。

E 減小競爭發生可能性的有效方式是盡可能縮短把持鎖的時間



答案: A D



第16題:


 二、解答題

調用動態連接庫的函數有哪幾種方法?



 調用一個DLL中的函數有兩種方法: 1.載入時動態鏈接(load-time dynamic linking),模塊非常明確調用某個導出函數,使得他們就像本地函數一樣。這需要鏈接時鏈接那些函數所在DLL的導入庫,導入庫向系統提供了載入DLL時所需的信息及DLL函數定位。 2.運行時動態鏈接(run-time dynamic linking),運行時可以通過LoadLibrary或LoadLibraryEx函數載入DLL。DLL載入后,模塊可以通過調用GetProcAddress獲取DLL函數的出口地址,然后就可以通過返回的函數指針調用DLL函數了。如此即可避免導入庫文件了。



第17題:


 WM_QUIT消息的用途是什么?一個普通的Windows窗口能收到的最后一條消息是什么?



 WM_QUIT通知程序退出,一般情況下在主線程中會有一個循環如下:

    while(GetMessage(......))

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }

      如果GetMessage獲得的是WM_QUIT消息,GetMessage便會返回FALSE,導致while循環退出,一般情況下,程序也會退出。windows窗口不會受到WM_QUIT消息。

     

    普通Windows窗口能收到的最后一條消息時WM_DESTROY。



第18題:


 有pqueue.h如下


#ifndef HEADER_PQUEUE_H

#define HEADER_PQUEUE_H

typedef struct_pqueue{

    pitem *items;

     int count;

}pqueue_s;

typedef struct_pqueue *pqueue;

typedef struct_pitem{

    unsigned char priority[8];

    void *data;

    struct_pitem *next;

}pitem;

typedef struct_pitem *piterator;

pitem *pitem_new(unsigned char *prio64be,void *data);

void pitem_free(pitem *item);

  

pqueue pqueue_new(void);

void pqueue_free(pqueue pq);

pitem *pqueue_insert(pqueue pq,pitem *item);

pitem *pqueue_peek(pqueue pq);

pitem *pqueue_pop(pqueue pq);

pitem *pqueue_find(pqueue pq,unsigned char *prio64be);

pitem *pqueue_iterator(pqueue pq);

pitem *pqueue_next(piterator *iter);

int pqueue_size(pqueue pq);

#endif /*! HEADER_PQUEUE_H */

pq_test.c如下:


#include<stdlib.h>

#include<string.h>

#include"pqueue.h"

/*remember to change expected.txt if you change there values*/

unsigned char prio1[8]="supercal";

unsigned char prio2[8]="ifragili";

unsigned char prio3[8]="sticexpi";

static void

pqueue_print(pqueue pq)

{

     pitem *iter,*item;

     iter=pqueue_iterator(pq);

     for(item=pqueue_next(&iter);item!=NULL;

         item=pqueue_next(&iter)){

         printf("item\t%02x%02x%02x%02x%02x%02x%02x%02x\n",

             item ->priority[0],item->priority[1],

             item ->priority[2],item->priority[3],

             item ->priority[4],item->priority[5],

             item ->priority[6],item->priority[7],

         }

}

int main(void)

{

     pitem *item;

     pqueue pq;

     pq=pqueue_new();

     item=pitem_new(prio3,NULL);

     pqueue_insert(pq,item);

  

     item=pitem_new(prio1,NULL);

     pqueue_insert(pq,item);

  

     item=pitem_new(prio2,NULL);

     pqueue_insert(pq,item);

     item=pqueue_find(pq,prio1);

     fprintf(stderr,"found %p\n",item->priority);

     item=pqueue_find(pq,prio2);

     fprintf(stderr,"found %p\n",item->priority);

  

     item=pqueue_find(pq,prio3);

     fprintf(stderr,"found %p\n",item->priority);

      

     pqueue_print(pq);

     for(item=pqueue_pop(pq);item!=NULL;item=pqueue_pop(pq))

     pitem_free(item);

  

     pqueue_free(pq);

     return 0;

}

   

pq_test.sh如下:


#!/bin/sh

set -e

./pq_test | cmp $srcdir/pq_expected.txt-

   

pq_expected.txt如下:

item 6966726167696c69

item 7374696365787069

item 737570657263616c

1.根據測試代碼描述pqueue的工作原理。

2.請實現 pitem *pqueue_insert(pqueue pq,pitem *item);






 測試文件的內容輸出的是struct_pitem結構中的priority字段的16進制形式,將其轉換為字符串正好是通過pqueue_insert函數放入到pqueue結構中的prio3、prio1、prio2的值。通過觀察測試文件中每一行的值可以發現對應的字符串序列為prio3、prio2、prio1,跟插入字符串的順序并不一致,說明pqueue既不是先進先出(隊列),也不是后進先出(棧)。

另外,通過觀察測試文件可以發現測試文件中的字符串是按照從小到大排列的,而且struct_pitem中的priority字段含義可以理解,這是一個優先級隊列,priority字段代表隊列的優先級,priority字段越小,優先級越高。

理解了隊列的結構后,就可以寫出插入的代碼了。

pitem *pqueue_insert(pqueue pq, pitem *item)

{

    if (!item)

    {

        return NULL;

    }

     

    if (pq->count == 0)

    {

        pq->items = item;

        count++;

        return pq->items;

    }

     

    // 查找要插入的位置

    pitem *iter, *item2, *item_before = NULL;

    iter = pqueue_iterator(pq);

    for(item2=pqueue_next(&iter); item2!=NULL; item2=pqueue_next(&iter))

    {

        int result = 0;

        for (int i=0; i<8; i++)

        {

            if (item[i] < item2[i])

            {

                result = -1;

            }

            else if (item[i] < item2[i])

            {

                result = 1;

            }

        }

         

        if (result == -1)

        {

            break;

        }

        item_before = item2;

    }

     

    if (!item_before)

    {

        // item需要插入到隊列中的第一個位置

        item_before = pq->items;

        pq->items = item;

        item->next = item_before;

    }

    else

    {

        pitem *tmp = item_before->next;

        item_before->next = item;

        item->next = tmp;

    }

    pq->count++;

    return item;

}


關聯標簽:
中国男女WWXXXXX