2011百度校園招聘筆試題 C++類-附原創答案


最近在看各個公司的筆試面試題,這份題是百度11年的筆試題,答案是自己做的,也許有考慮不周的地方,歡迎各位

朋友指正。

一、選擇題

 1.下列關於對象初始化的敘述中,正確的是

 A 定義對象的時候不能對對象進行初始化

 B 定義對象之后可以顯式地調用構造函數進行初始化

 C 定義對象時將自動調用構造函數進行初始化

 D 在一個類中必須顯式地定義構造函數實現初始化

答案:C. (對象在定義時會自動調用構造函數進行初始化)
2.下列關於基類和派生類關系的敘述中,正確的是

A 每個類最多只能有一個直接基類
B 派生類中的成員可以訪問基類中的任何成員
C 基類的構造函數必須在派生類的構造函數體中調用
D 派生類除了繼承基類的成員,還可以定義新的成員

答案:D.

 3.下列關於賦值運算符“=”重載的敘述中,正確的是

 A 賦值運算符只能作為類的成員函數重載

 B 默認的賦值運算符實現了“深層復制”功能

 C 重載的賦值運算符函數有兩個本類對象作為形參

 D 如果己經定義了復制(拷貝) 構造函數,就不能重載賦值運算符

答案:A

 4.下列選項中,正確的C++標識符是

 A     6_group B      group~6 C    age+3 D  _group_6

答案:D

 5. 下列循環語句中有語法錯誤的是

 A       int i;for( i=1;i<10;i++)cout<<‘*‘;

 B     int i,j;for(i=1,j=0;i<10;i++,j++)cout<<‘*‘;

 C     int i=0;for(;i<10;i++)cout<<‘*‘;

 D     for(1)cout<<‘*‘;

答案:D. 其他三個都能正常運行

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

 A int px*;   B char *acp[10];C char(*pac)[10];  D int(*p)();

答案:A. A明顯編譯不過。 B定義了一個數組;C 定義了一個指針pac,它指向含有10個char型元素的數組首地址
        D.定義了函數指針p,這個指針指向的函數無參數且返回一個int值

7. 若MyClass為一個類,執行“MyClass a[4],*p[5];”語句時會自動調用該類構造函數的次數是

A 2 B 5 C 4 D 9
答案:C.  a[4]定義了4個元素的數組,數組里存的是MyClass對象,故要調用默認的構造函數來初始化4個MyClass對象,
        *p[5]定義了5個元素的數組,數組中存放的是指向MyClass對象的指針,故沒有實例化MyClass對象。
寫個小程序驗證一下:
#include <iostream>
using namespace std; class myClass{ public: myClass(){ cout<<"constructor called..."<<endl; } }; int main(){ myClass a[4],*p[5]; cout<<sizeof(a)/sizeof(myClass)<<endl; cout<<sizeof(p)/sizeof(myClass)<<endl; cout<<sizeof(*p)/sizeof(myClass)<<endl; system("pause"); return 0; }

輸出:

這里a數組的大小其實也是4(因為空類占有大小為1字節),p的大小為20字節,因為每個指針占有4字節,
*p里面是指針,故大小為4字節。
8. 有如下程序:
#include<iostream>
#include<cmath>
using std::cout;

classPoint{

public:

friend double distance(const Point &p); //p距原點的距離

Point(int xx=0,int yy=0):x (xx),Y(YY){}//①

private:

     Int x,Y;
};

double distance(const Point &p) { //②

return sqrt(p.x*p.x+p.Y*p.Y);  

int main(){

Point p1(3,4);
cout<<distance(p1); //③
return 0;  
}  
下列敘述中正確的是
A 程序編譯正確   B 程序編譯時語句①出錯
C 程序編譯時語句②出錯   D程序編譯時語句③出錯
答案:A. 經過驗證,程序編譯正確。
9. 下列哪兩個是等同的
  int b;

 1.const int *a =&b; 2.const * int a = &b;

  3. const int*const a = &b;  4.int const* const a = &b;

答案:3和4相同。 1定義一個指針a,它指向一個整型的不變量,即不能通過a來修改b的值(但b的值是可以修改的)
           2編譯錯誤。3和4均定義的指針它本身就不可改變(不能再把另外的變量地址賦值給它),它指向的變量也不可通過
          它來修改。
10. 有如下語句序列:
char str[10];cin>>str;
  當從鍵盤輸入”I lovethis game”時,str中的字符串是

A"I love this game"B "I love thi" C"I love" D "I"

答案:D. str的地址是數組的首地址,也就是str[0],故字符串中只有一個字符I

 11. 有函數模板聲明和一些變量定義如下:

 template<class Tl,class T2,class T3>T1 sum(T2,T3);

 double dl,d2;

 則下列調用中,錯誤的是

 A sum<double,double,double>(dl,d2);  B sum<double;double>(d1,d2);

 C sum<double>(d1,d2);   D sum(d1,d2);

答案:D. D會導致編譯錯誤,因為編譯器無法去匹配參數列表

 12. 以下程序段完全正確的是

 A int*p; scanf("%d",&p); B int *p; scanf(“%d”,p);

 C int k,*p=&k; scanf("%d",p); D int k,*p:; *p= &k; scanf(“%d”,p);

答案:A,C. A項編譯能通過,也能運行,定義了一個指針p,並給這個指針賦值(輸入的是地址)

        B項中指針p的值沒有定義,此時它沒有指向任何內存地址,故通過它來給對應的內存地址輸入

        變量是錯誤的。C正確,通過p來給k賦值。D編譯不過,語句*p=&k錯誤

13. 有定義語句:int *p[4];以下選項中與此語句等價的是
Aint p[4]; B int **p; C int *(p「4」); Dint (*p)「4」;
答案:C.   D項定義了一個指針p,它指向有4個整型元素的數組。
14. 若要重載+、=、<<、=和[]運算符,則必須作為類成員重載的運算符是
A +和= B =和<< C ==和<< D =和[]
答案:D  A中+可以為友元,B中<<可以為友元,C中==和<<均可以為友元
15. 下列說法正確的是( )
A 內聯函數在運行時是將該函數的目標代碼插入每個調用該函數的地方
B 內聯函數在編譯時是將該函數的目標代碼插入每個調用該函數的地方
C 類的內聯函數必須在類體內定義
D 類的內聯函數必須在類體外通過加關鍵字inline定義
答案:B
16. 下面對於友元函數描述正確的是( )
A 友元函數的實現必須在類的內部定義
B 友元函數是類的成員函數
C 友元函數破壞了類的封裝性和隱藏性
D 友元函數不能訪問類的私有成員
答案:C

17. 在公有派生情況下,有關派生類對象和基類對象的關系,下列敘述不正確的是( )
A 派生類的對象可以賦給基類的對象
B 派生類的對象可以初始化基類的引用
C 派生類的對象可以直接訪問基類中的成員
D 派生類的對象的地址可以賦給指向基類的指針
答案:C. 其它都是多態的特性
18. 下列關於多態性的描述,錯誤的是( )
A C++語言的多態性分為編譯時的多態性和運行時的多態性
B 編譯時的多態性可通過函數重載實現
C 運行時的多態性可通過模板和虛函數實現
D 實現運行時多態性的機制稱為動態綁定
答案:C. 模版是編譯時的多態
19. 如果友元函數重載一個運算符時,其參數表中沒有任何參數則說明該運算符是( )
A 一元運算符 B二元運算符 C 選項A 和選項B 都可能 D 重載錯誤
答案:D. C++中用友元函數重載運算符至少有一個參數,重載一目運算符要有一個參數,重載二目運算符要有兩個參數
20. 在下列關於C++函數的敘述中,正確的是( )
A 每個函數至少要有一個參數 B 每個函數都必須返回一個值
C 函數在被調用之前必須先聲明 D 函數不能自己調用自己
答案:C

21. 如果進棧序列為el,e2,e3,e4,則可能的出棧序列是 ( )

A e3,el,e4,e2 B e2,e4,e3,el C e3,e4,e1,e2 D 任意順序
答案:B. 排除法
22. 下面關於模板的描述,錯誤的是 ( )
A 函數模板和類模板的參數可以是任意的數據類型
B 類模板不能直接使用,必須先實例化為相應的模板類.然后定義了模板類的對象
C 函數模板不能直接使用,需要實例化為模板函數后才能使用
D 類模板的成員函數都是模板函數
答案:A
參數不能是任意類型的,至少該有明確的類型,比如抽象類就不行。
D中可能有些疑惑:
類模版的成員函數有兩種情況:
1。涉及模板參數T的一定是個函數模板;
2。 不涉及(形式上,函數體,參數表內沒出現)模板參數T的也是個函數模板;
       角度一:成員函數的類型中包含一個屬性“屬於什么類”,所以void A<T>::fun(){};這是就和T建立了聯系,這時就能說明即使函數體內不涉及T類型,它也是個函數模板,因為由不同T類型,是不同的函數類型(因為域概念是成員函數類型的一部分)
23. 下面對靜態數據成員的描述中,正確的是( )
A 靜態數據成員可以在類體內進行初始化
B 靜態數據成員不可以被類的對象調用
C 靜態數據成員不受private控制符的作用
D 靜態數據成員可以直接用類名調用
答案:D
B明顯不對。A其實有點歧義,一般來說靜態成員是在類中聲明,類外定義初始化,但當靜態成員是const int時是
可以直接在類內部進行初始化的(此時還是要在類外部聲明一下)
C也是有歧義的,靜態變量的初始化時不受private作用,可以在類外進行初始化,但之后引用修改就不行了
24. 對類成員訪問權限的控制,是通過設置成員的訪問控制屬性實現的,下列不是訪問控制屬性的是( )

A 公有類型 B私有類型 C 保護類型 D友元類型

答案:D

25.抽象基類是指( )

A 嵌套類 B 派生類  C含有純虛函數 D 多繼承類
答案:C
26.如果已定義了一個C++類CMyList並有以下語句:
CMyList list(3);
以下說法正確的是()。
A 該語句會創建一個CMyList類的一個對象;
B 該語句會創建一個CMyList類的3個對象;
C 必須為類CMyList定義一個構造函數;
D 必須為類CMyList定義一個析構函數;
E 必須定義函數CMyList list(int);
答案:C.  
必須定義參數為int類型的構造函數,否則編譯不通過。

27. 以下說法正確的是( )。

A內聯(inline)函數改善了函數調用的執行效率。
B類A的友元(friend)函數可以訪問類A的私有成員。
C類A的友元(friend)類B可以訪問類A的私有成員。
D類A的靜態數據成員為類A的所有對象所共享。
E類A的靜態成員函數沒有傳遞this 指針作為參數。
答案:A,B,C,D,E
28.類B從類A派生,則類B可以訪問類A中的( )成員。
A public成員 B private成員 Cprotected成員 D數據成員 E函數成員
答案:A,C
29. 面向對象的程序設計語言具有()等共同特性。
A封裝性 B多態性 C簡單性 D復雜性 E繼承性
答案:A,B,E
30.  現有一個程序如下:
 
class A{ public: void f(){ cout<<"A::f().."<<endl; } }; class B{ public: void f(){ cout<<"B::f().."<<endl; } void g(){ cout<<"B::g().."<<endl; } }; class C:public A,public B{ public : void g(){ cout<<"C::g().."<<endl; } void h(){ cout<<"C::h().."<<endl; f();// 語句1 } }; int main(){ C obj;
obj.f();//語句2 obj.A::f();//語句3 obj.B::f();//語句4 obj.g(); //語句5 system(
"pause"); return 0; }
則編譯時會產生錯誤的語句有()
A語句1 B語句2 C語句3 D語句4 E語句5
答案:A,B 
二.填空題
1. int func(x){
int countx = 0;
while(x){
countx ++;
x = x&(x-1);
}
return countx;
}
假定x = 9999。 函數的運行結果為:8
分析:該函數功能是計算一個數x二進制表示中1的個數
x&(x-1)計算后x每次少一個1
2. 一個棧的初始狀態為空。首先將元素5,4,3,2,1 依次入棧,然后退棧一次,再將元素A,B,C,D依次入棧,
之后將所有元素全部退棧,則所有元素退棧(包括中間退棧的元素)的順序為: 1DCBA2345
3. 一棵二叉樹有10個度為1的結點,7個度為2的結點,則該二叉樹共有25個結點。
分析:在二叉樹 度為二的節點數=度為一的節點+1
4. 一個雙目運算符作為類的成員函數重載時,重載函數的參數表中有1個參數
分析:作為類的成員函數時,會傳入代表本對象的this指針,從而省去了一個參數
5. #define DOUBLE(x) x+x ,i= 5*DOUBLE(5); i的值為30
分析:宏定義只是簡單的展開替換,不作處理
6. switch()中不允許的數據類型是:除整型和字符型外的其他類型都不允許
7. 某32位系統下, C++程序void *p = malloc( 100 ); sizeof (p) = 4
分析:32位機上,各種類型的指針均為4字節
8. int a = 4;(++a) += a;執行后a的值為10
分析:先做a的自增,a值變為5(修改了內存地址中的值,等式兩邊均變為5),相加為10
          (a++) +=a是不合法的,因為a已經做了自增,此時還要返回a原先的值,並要用這個值
           和等號右邊的a值(已經自增過了)做運算,自然不合法。
           (++a) += a++ 執行完后,a值為11. 相當於再做一次自增
9. 派生類中的成員函數可以直接訪問基類中的公有成員和保護成員。
10. C++語言的參數傳遞機制包括傳值和傳引用兩種
三.閱讀題
1 .寫出函數Test 的運行結果
void Test(void){ char *str = (char *) malloc(100); strcpy(str,"hello"); // cout<<str<<"  "<<*str<<endl; free(str); if(str!= NULL){ strcpy(str,"world"); printf(str); } }

分析:程序會崩潰。因為free函數釋放了str所指的內存,但指針值此時不為NULL,故if塊中的語句會執行,導致試圖將對一塊兒不合法的內存寫入數據。所以一般調用完free函數釋放完空間后應將指針顯示賦值為NULL

2.寫出程序的運行結果

 

#include <iostream>
using namespace std; class Base{ int x; public: Base(int b):x(b){} virtual void display(){ cout<<x<<endl; } }; class Derived:public Base{ int y; public: Derived(int d):Base(d),y(d){} void display(){ cout<<y<<endl; } }; int main(){ //Test();
    Base b(1); Derived d(2); b.display(); d.display(); Base *p=&d; p->display(); //Base *q=new Derived;
    system("pause"); return 0; }

程序輸出:

1

2

2

3.下面的函數實現在一個固定的數上加上一個數,有什么錯誤,改正

int add_n(int n) { static int i=100; i+=n; return i;}

分析:題目的意思有點兒不太明了,固定的數是指每次都給100上加一個指定的值嗎?這樣的話要去掉

          static關鍵字。

4.i最后等於多少?

int i = 1;

int j = i++;

if((i>j++) && (i++ == j)) i+=j;

分析:i為5,j為2 。

5.

#include <iostream>

using namespace std;

constint SIZE=10;

class stack{

char stck[SIZE];

int top;

public:

void init();

void push(char ch){

char pop();

};

void stack::init()

{ top=0; }

void stack:push(char ch){

if(top==SIZE){

cout<<”Stack is full.\n”;

return ;

}

stck[top++]=ch;

}

char stack:pop(){

if(top==0){

cout<<”Stack is empty.\n”;

return 0;

}

return stck[--top];

}

void main(){

stack s1, s2;

s1.init();

s2.init();

s1.push(‘a’);

s1.push(‘b’);

s1.push(‘c’);

s2.push(‘x’);

s2.push(‘y’);

s2.push(‘z’);

for(int i=0; i<3; i++) cout<<”Pop s1:”<< s1.pop();

for(i=0; i<3; i++) cout<<”Pop s2:”<< s2.pop();

}

分析:輸出cbazyx

四.附加題

寫一個Singleton。Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。

C++代碼:

 

class Singleton{ private: static Singleton *instance; Singleton(){cout<<"Singleton example";} public: static Singleton* getSingleton(){ if(instance==NULL){ instance=new Singleton(); } return instance; } }; Singleton * Singleton::instance=NULL;

 

注意兩點:

1.構造函數為私有,防止直接實例化。

2.指針為靜態變量

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM