1. 程式人生 > >騰訊C++筆試題(不知道是哪年的)

騰訊C++筆試題(不知道是哪年的)

 

不知道正確答案,都是自己做的,有做的思路。此文起交流之用,做錯的請指正,謝謝。

一.  單選題(每題4分,15題,共60分)
1.考慮函式原型void hello(int a,int b=7,char* pszC=”*”),下面的函式呼叫鍾,屬於不合法呼叫的是:
A hello(5)     B.hello(5,8)     C.hello(6,”#”)     D.hello(0,0,”#”)

答:C。這個是函式的宣告,如果引數在宣告的時候有預設值一定要放到引數列表的最後。呼叫函式時,沒有預設值的引數一定要賦值,C賦值型別錯了


2.下面有關過載函式的說法中正確的是:

A.過載函式必須具有不同的返回值型別   B.過載函式形參個數必須不同
C.過載函式必須有不同的形參列表       D.過載函式名可以不同

答:C。構成函式過載的條件是:函式引數的個數不同,引數型別不同。返回值不同不能構成過載

3.分析一下程式的執行結果:
#include<iostream.h>
class CBase
{
public:
CBase(){cout<<”constructing CBase class”<<endl;}
~CBase(){cout<<”destructing CBase class”<<endl;}
};
class CSub : public CBase
{
public:
CSub(){cout<<”constructing CSub class”<<endl;}
~CSub(){cout<<”destructing CSub class”<<endl;}
};
void main()
{
CSub obj;
}
A. constructing CSub class           B. constructing CBase class
constructing CBase class             constructing CSub class
destructing CSub class               destructing CBase class
destructing CBase class              destructing CSub class
C. constructing CBase class
constructing CSub class
destructing CSub class
destructing CBase class
D. constructing CSub class
constructing CBase class
destructing CBase class
destructing CSub class

答:C。這個是關於繼承的。子類構造一個物件時,先要父類去呼叫父類的建構函式,然後子類呼叫自己的建構函式完成子類的物件構造。析構時卸掉子類的,再卸掉父類的。

這個好像是跟棧是一樣的。先進後出。


4.在一個cpp檔案裡面,定義了一個static型別的全域性變數,下面一個正確的描述是:
A.只能在該cpp所在的編譯模組中使用該變數
B.該變數的值是不可改變的
C.該變數不能在類的成員函式中引用
D.這種變數只能是基本型別(如int,char)不能是C++型別

答;A。static修飾的變數的記憶體是在堆上。這裡的static變數還是全域性變數。當然在該cpp所在的編譯模組中使用該變數。static修飾的區域性變數與全域性變數的區別在於作用域的差別。static變數只能於區域性訪問,全域性就顧名思義。但static變數不會因為函式的執行完成而被銷燬。

5.觀察下面一段程式碼:
class ClassA
{
public:
virtual ~ ClassA(){};
virtual void FunctionA(){};
};
class ClassB
{
public:
virtual void FunctionB(){};
};
class ClassC : public ClassA,public ClassB
{
public:
};

ClassC aObject;
ClassA* pA=&aObject;
ClassB* pB=&aObject;
ClassC* pC=&aObject;
關於pA,pB,pC的取值,下面的描述中正確的是:

A.pA,pB,pC的取值相同.               B.pC=pA+pB
C.pA和pB不相同                      D.pC不等於pA也不等於pB

答:A。他們都是aObject物件的地址。所以是相同的。但是pA,pB,pC儘管值是相同的,但是在訪問資料的時候卻不相同。pA只能訪問A中的函式,pB只能訪問B中的函式。pC能訪問A B C中的函式。因為在指標賦值中,指標的型別發生了隱式的型別轉換。

6.參照1.5的程式碼,假設定義了ClassA* pA2,下面正確的程式碼是:
A.pA2=static_cast<ClassA*>(pB);
B.void* pVoid=static_cast<void*>(pB);
pA2=static_cast<ClassA*>(pVoid);
C.pA2=pB;
D.pA2=static_cast<ClassA*>(static_cast<ClassC*>(pB));

答:D


7.參照1.5的程式碼,下面那一個語句是不安全的:
A.delete pA   B.delete pB   C.delete pC

答:B。B錯誤的原因是B沒有寫解構函式,預設的解構函式不是虛擬函式。這樣當要銷燬掉pB時,只是析構掉了pC指向的那塊記憶體,而pB指向的記憶體沒有被釋放了,這就造成了記憶體洩露的問題。


8.下列程式的執行結果為:
#include<iostream.h>
void main()
{
int a=2;
int b=++a;
cout<<a/6<<endl;
}
A.0.5   B.0   C0.7   D.0.6666666-

答:B.a++後等於3.但是a的型別是int 型。所以3/6被四捨五入了。也就輸出了0.
9.有如下一段程式碼:
#define ADD(x,y) x+y
int m=3;
m+=m*ADD(m,m);
則m的值為:

A.15   B.12   C.18   D.58

答:A。這是一個關於巨集的,一定要注意,巨集只是替換! 所以m=m+(m*m+m)=15;


10.如下是一個帶權的圖,圖中結點A到結點D的關鍵路徑的長度是:
A.13       B.15       C.28       D.58

答:這個在網上沒有看到有圖的。不能解答。是資料結構中的問題啦

11.下面的模板宣告中,正確的是:
A.template<typename T1,T2>
B.template<class T1,T2>
C.template<class T1,class T2>
D.template<typename T1;typename T2>

答:C。模板的定義資料型別變數都是需要typename的,不能省略。A B省略了。D不是以分號相隔的。
12.在Windows程式設計中下面的說法正確的是:

A.兩個視窗,他們的視窗控制代碼可以是相同的     B.兩個視窗,他們的處理函式可以是相同的
C.兩個視窗,他們的視窗控制代碼和視窗處理函式都不可以相同.

答:B。B是顯而易見的正確。只要是視窗,他們都可以去呼叫CWnd中的成員函式,比如:SetWindowText。控制代碼是不可以相同的,控制代碼是唯一標示一個資源的指標。


13.下面哪種情況下,B不能隱式轉換為A?
A.class B:public A{}                 B.class A:public B{}
C.class B{operator A();}             D.class A{A(const B&);}

答:B。這個應該也是繼承的問題。在講虛擬函式的時候有講到。B中B是A的父類。父類是不能隱式轉換成子類的。相反就可以。


14.某公司使用包過濾防火牆控制進出公司區域網的資料,在不考慮使用代理伺服器的情況下,下面描述錯誤的是”該防火牆能夠(   )”.
A.使公司員工只能訪問Internet上與其業務聯絡的公司的IP地址.
B.僅允許HTTP協議通過,不允許其他協議通過,例如TCP/UDP.
C.使員工不能直接訪問FTP伺服器埠號為21的FTP地址.
D.僅允許公司中具有某些特定IP地址的計算機可以訪問外部網路

答:B


15.數字字元0的ASCII值為48,若有以下程式:
main()
{
char a=’1’,b=’2’;
printf(“%c,”,b++);
printf(“%d\n”,b-a);
}
程式執行之後的輸出結果是:
A.3,2      B.50,2       C.2,2     D.2,50

 答:C。0是48,1是49,2是50,3是51

b++注意是右++,不是左++。注意他們的區別就不會做錯了。b++返回的還是b。字元就是2。這是b是51,51-49=2。輸出整數也就是2