當前位置:才華齋>計算機>計算機二級>

計算機二級C++考試專家預測試卷及答案

計算機二級 閱讀(2.92W)

為了使廣大考生在備戰計算機等級考試時,更快的掌握相應知識點,下面是小編搜尋整理的計算機二級C++考試專家預測試卷及答案,供參考練習,預祝考生們考出自己理想的成績!

計算機二級C++考試專家預測試卷及答案

選擇題(每小題1分,共40小題,共40分)

1、資料的儲存結構是指( )。

A.資料所佔的儲存空間

B.資料的邏輯結構在計算機中的存放形式

C.資料在計算機中的順序儲存方式

D.儲存在計算機外存中的資料

2.將E-R圖轉換到關係模式時,實體與實體間的聯絡可以表示成( )。

A.屬性

B.關係

C.鍵

D.域

3.對長度為n的線性表進行順序查詢,在最壞情況下需要比較的次數為( )。

A.125

B.n/Z

C.n

D.n+1

4.樹是結點的集合,它的根結點的數目是( )。

A.有且只有1個

B.1或多於1

C.0或1

D.至少有2個

5.設R是一個二元關係,S是一個三元關係,則下列運算中正確的是( )。

A.R-S

B.R×S

C.R∩S

D.R∪S

6.關於結構化程式設計原則和方法的描述錯誤的是( )。

A.選用的結構只允許有一個入口和一個出口

B.複雜結構應該用巢狀的基本控制結構進行組合巢狀來實現

C.不允許使用GOTO語句

D.語言中所沒有的控制結構,應該採用前後一致的方法來模擬

7.對關係S和R進行集合運算,結果中既包含S中的所有元組也包含R中的所有元組,這樣的集合運算稱為( )。

A.並運算

B.交運算

C.差運算

D.積運算

8.下列敘述中正確的是( )。

A.在面向物件的程式設計中,各個物件之間具有密切的關係

B.在面向物件的程式設計中,各個物件都是公用的

C.在面向物件的程式設計中,各個物件之間相對獨立,相互依賴性小

D.上述三種說法都不對

9.結構化程式設計的三種基本結構是( )。

A.過程、子程式和分程式

B.順序、選擇和重複

C.遞迴、堆疊和佇列

D.呼叫、返回和轉移

10.在資料庫設計中,將E-R圖轉換為關係模式的過程屬於( )。

A.需求分析階段

B.邏輯設計階段

C.概念設計階段

D.物理設計階段

11.在C++語言中函式返回值的型別是由( )決定的。

A.呼叫該函式時系統臨時

B.return語句中的表示式型別

C.定義該函式時所指定的函式型別

D.呼叫該函式時的主調函式型別

12.下列描述正確的是( )。

A.表示m>n為true或mn&&m<n

B.switch語句結構中必須有default語句

C.if語句結構中必須有else語句

D.如果至少有一個運算元為true,則包含‖運算子的表示式為true

13.使用ifstream流類定義流物件並開啟磁碟檔案時,檔案的隱含開啟方式為( )。

A.ios::in

B.ios::out

C.ios::inlios::out

D.沒有預設

14.下列各類函式中,不是類的成員函式的是( )。

A.建構函式

B.抽象類

C.派生類

D.以上都不對

15.下面關於陣列的初始化正確的是( )。

A.charstr[]={’a’,’b’,’e’}

B.charstr[2]={’a’,’b’,’e’)

C.charstr[2][3]={{’a’,’b’},{’C’,’d’},{’e’,’f’}}

D.charstr()={’a’,’b’,’C’}

16.類模板templateclassX{…},其中友元函式f對特定型別T(如int),使函式f(x)成為x模板類的友元,則其說明為( )。

A.friendvoidf();

B.friendvoidf(x);

C.friendvoidA::f();

D.friendvoidC::f(x);

17.類MyClass的定義如下:

classMyClass

{

public:

MyClass(){value=0;}

SetVariable(inti){valtic=i;}

private:

intvalue;

};

MyClass*P,my;p=&my;

則對下列語句序列正確的描述是( )。

A.語句p=&my;是把物件my賦值給指標變數P

B.語句MyClass*P,my;會呼叫兩次類MyClass的建構函式

C.對語句*P.SetVariable(5)的呼叫是正確的

D.語句P->SetVariable(5)與語句my.SetVariable(5)等價

18.下面關於break語句的描述中,不正確的是( )。

A.break可以用於迴圈體內

B.break語句可以在for迴圈語句中出現多次

C.break語句可以在switch語句中出現多次

D.break語句可用於if條件判斷語句內

19.如果表示式-x/y中的“--”和“/”是作為友元函式過載的運算子,採用運算子函式呼叫格式,該表示式還可表示為( )。

A.operator/(x.operator--(),y);

B.operator/(operator--(x),y);

C.X.operator--().operator/(y);

D.y.operator/(operator--(x));

20.已知類A有公用資料成員a,並重載了=運算子,且有Aobj2;constA*ptr=newA;,則下列語句錯誤的是( )。

A.ptr->a=100;

B.ptr=&obj2;

C.ptr++;

D.obj2=*ptr;

21.可以用P.a的形式訪問派生類物件P的基類成員a,其中a是( )。

A.私有繼承的公有成員

B.公有繼承的私有成員

C.公有繼承的保護成員

D.公有繼承的公有成員

22.下面程式的執行結果為( )。

#include

classA

{

intnum;

public:

A(inti){num=i;)

A(A&a){num=a.num++;}

voidprint(){cout<<num;}

};

voidmain()

{

Aa(1),b(a);

a.print();

b.print();

}

A.11B.12

C.21D.22

23.設有定義charstr[80];以下不能將輸入資料first\nsecond\n讀取到陣列str中的語句是( )。

A.cin.get(str,strlen(str));

B.cin.getline(str,strlen(str));

C.cin>>str;

D.cin.read(str,strlen(str));

24.下列程式的輸出結果為( )。

#include

classTestClass

{

public:

TestClass(){val++;}

static,intval;

};

intTestClass::val=0;

voidmain()

{

TestClasscsl;

cout<<csl.val<<"";

TestClasscs2;

TestClasscs3,cs4;

cout<<cs2.val<<endl;

}

A.O3

B.13

C.14

D.24

25.有以下類定義:

classMyClass

{

private:

intid;

chargender;

char*phone;

public:

MyClass():id(0),gender(’#’),phone(NULl){}

MyClass(intn0,charge=’#’,char*ph=NULL)

{id=no;gender=ge;phone=ph;}

};

下列類物件定義語句中錯誤的是( )。

A.MyClassmyObj;

B.MyClassmyObj(11,"13301111155");

C.MyClassmyObj(12,’m’);

D.MyClassmyObj(12);

26.下列是關於派生類宣告的開始部分,其中正確的是( )。

A.classvirtualB:publicA

B.virtualclassB:publicA

C.classB:publicAvirtual

D.classB:virtualpublicA

27.如果類A被說明成類B的友元,則( )。

A.類A的成員即類B的成員

B.類B的成員即類A的成員

C.類A的成員函式不得訪問類B的成員

D.類B不一定是類A的友元

28.下列關於虛基類的描述,錯誤的是( )。

A.設定虛基類的目的是為了消除二義性

B.虛基類的建構函式在非虛基類之後呼叫

C.若同一層中包含多個虛基類,這些虛基類的建構函式按它們說明的次序呼叫

D.若虛基類由非虛基類派生而來,則仍然先呼叫基類建構函式,再呼叫派生類的建構函式

29.下列關於多型性的描述,錯誤的是( )。

A.C++語言中的多型性分為編譯時的多型性和執行時的多型性

B.編譯時的多型性可通過函式過載實現

C.執行時的多型性可通過模板和虛擬函式實現

D.實現執行時多型性的機制稱為動態繫結

30.若有如下程式:

#include

usingnamespacestd;

classTestClassl

{

private:

inta;

public:

TestClassl(inti)

{

a=i:

}

voiddisp( )

{

cout<<a<<",";

}

};

classTestClass2

{

private:

intb:

public:

TestClass2(intj)

{

b=j;

}

voiddisp()

{

cout<<b<<",";

}

};

classTestClass3:publicTestClass2,publicTestClassl

{

private:

intc;

public:

TestClass3(intk):TestClass1(k-2),TestClass2(k+2)

{

c=k:

}

voiddisp()

{

TestClasssl::disp();

TestClasss2::disp();

cout<<c<<endl;

}

};

intmain()

{

TestClass30bj(10);

obj.disp();

return0;

}

程式執行後的輸出結果是( )。

A.10,10,10

B.10,12,14

C.8,10,12

D.8,12,10

31.在下列程式的橫線處填上適當的內容,使程式執行後的輸出結果為ABCD( )。

#include

usingnamespacestd;

classA

{

public:A(){cout<<’A’;}

};

classB:

{

public:B(){cout<<’B’;}

};

classC:virtualpublicA

{

public:C(){cout<<’C’;}

};

classD:publicB,publicD

{

public:D(){cout<<’D’;}

};

voidmain(){D04;}

A.publicA

B.privateA

C.protectedA

D.virtualpublicA

32.有如下程式:

#include

usingnamespacestd;

classAA{

intn;

public:

AA(intk):n(k){}

intget(){returnn;}

intget()const{returnn+1;}

};

intmain()

{

AAa(5);

constAAb(6);

cout<<a.get()<<b.get();

return0;

}

執行後的輸出結果是()。

A.55

B.57

C.75

D.77

33.有如下程式:

#include

usingnamespacestd;

classDemo

{

public:

Demo(){cout<<"defaultconstructor\n";}

Demo(constDemo&x){cont<<"copyconstruc-

tor\n";}

};

DemouserCode(Demob){Democ(b);returnC;}

intmain()

{

Demoa;d;

cout<<"callinguserCode()\n";

d=userCode(a):

return0;

}

執行上面程式的過程中,建構函式Demo( )和Demo(constDem0&x)被呼叫的次數分別是( )。

A.1和1

B.1和2

C.2和3

D.2和4

34.有如下程式:

#include

usingnamespacestd;

classDA{

intk;

public:

DA(intx=1):k(x){}

~DA(){cout<<k;}

};

intmain(){

DAd[]={DA(3),DA(3),DA(3));

DA+p=newDA[2];

[]p;

return();

}

這個程式的輸出結果是( )。

A.111

B.333

C.11333

D.11133

35.有如下程式:

#include

usingnamespacestd;

classMyClass{

public:

MyClass(intx):val(x){}

voidPrint()const{cout<<"const:val="<<<val<<’\t’;}

voidPrint(){cout<<"val="<<val<<’t’;}

private:

intval;

};

intmain(){

constMyClassobj1(10);

MyClassobj2(20);

obj1.Print();

obj2.Print();

return0;

}

程式的輸出結果是( )。

A.va1=10const:va1=20

B.const:va1=10const:va1=20

C.const:va1=10val=20

D.val=10va1=20

36.關於函式中的<返回型別>。下列表述中錯誤的是( )。

A.<返回型別>中有可能包含關鍵字int

B.<返回型別>中有可能包含自定義識別符號

C.<返回型別>中衣可能包含字元*

D.<返回型別>中可能包含[]

37.Sample是一個類,執行下面語句後,呼叫Sample類的建構函式的次數是( )。

Samplea[2],*p=newSample;

A.0

B.1

C.2

D.3

38.有如下兩個類定義:

classXX{

private:

doublex1;

protected:

doublex2;

public:

doublex3;

};

claseYY:protectedXX{

private:

doubley1;

protected;

doubley2;

public:

doubley3;

};

在類YY中保護成員變數的個數是( )。

A.1

B.2

C.3

D.4

39.下列關於運算子過載的描述中,錯誤的是( )。

A.可以通過運算子過載在C++中建立新的運算子

B.賦值運算子只能過載為成員函式

C.運算子函式過載為類的成員函式時,第一操作引數就是該類物件

D.過載型別轉換運算子時不需要宣告返回型別

40.下列關於類模板的描述中,錯誤的是( )。

A.類模板的成員函式都是模板函式

B.可以為類模板引數設定預設值

C.類模板描述了一組類

D.類模板中只允許有一個型別引數

答案解析:

1.B。【解析】資料的儲存結構,又稱為資料的物理結構,是資料的邏輯結構在計算機中的存放形式。資料的儲存結構有順序結構、鏈式結構、雜湊結構和索引結構等。

2.B。【解析】將E-R圖轉換成指定RDBMS中的關係模式是資料庫邏輯設計的主要工作。從E—R圖到關係模式的轉換是比較直接的,實體和聯絡都可以表示成關係。

3.C。【解析】對線性表進行順序查詢時,從表中的第一個元素開始,將給定的值與表中逐個元素的關鍵字進行比較,直到兩者相符,查詢到所要找的元素為止。在最壞情況下,要查詢的元素是表的最後一個元素或查詢失敗,這兩種情況都需要將這個元素與表中的所有元素進行比較,因此比較次數為n。

4.C。【解析】樹具有明顯的層次關係,即樹是一種層次結構。在樹結構中,根結點在第一層上。當樹為非空時,樹中有且只有一個根結點,當樹為空時,樹中根結點的數目為0。

5.B。【解析】關係的交(∩)、並(∪)和差(-)運算要求兩個關係是同元的,顯然作為二元的R和三元的S只能做笛卡兒積運算。

6.C。【解析】限制使用GOTO語句是結構化程式設計的原則和方法之一,但不是絕對不允許使用GOTO語句。其他三項為結構化程式設計的原則。

7.A。【解析】關係的並運算是指由結構相同的兩個關係合併,形成一個新的關係,其中包含兩個關係中的所有元組。

8.C。【解析】面向物件的程式設計是用物件模擬問題領域中的實體,各物件之間相對獨立,相互依賴性小,通過訊息來實現物件之間的相互聯絡。

9.B。【解析】程式的三種基本控制結構包括順序、選擇和重複(迴圈),這三種結構足以表達出各種其他形式的`結構。

10.B。【解析】資料庫設計階段主要包括需求分析、概念設計、邏輯設計和物理設計。其中邏輯設計的主要工作是將E-R圖轉換為關係模式。

11.C。【解析】函式型別決定了函式返回值的型別。函式值返回型別可以由編譯器自動完成型別轉換。在函式有返回值的呼叫中,編譯器將return後面的表示式的型別強制轉換為該函式定義時指定的返回值型別。

12.D。【解析】本題主要考查C++語言的基本語法,選項A中應該為m>n‖m<n;選項b中default語句可有可無;選項c中if可以單獨作為一條語句,不必須和else搭配。

13.D。【解析】使用ifstream流類定義流物件並開啟磁碟檔案時,檔案沒有預設的開啟方式。其中ios::in是為輸入而開啟;iso::out是為輸出而開啟。

14.C。【解析】建構函式包括預設建構函式和拷貝建構函式等,解構函式和建構函式一樣屬於類的特殊的成員函式。而友元函式則是為了增加類的訪問靈活性而允許其他類的成員函式或全域性函式訪問類的內部變數或成員函式的一種機制,其缺點是破壞了類的封裝性。

15.A。【解析】本題考查的是字元陣列的初始化。選項B中用三個元素初始化大小為2的陣列,越界了;選項C中應該是2行3列的陣列,題中使用3行2列初始化;選項D中陣列應用方括號。

16.B。【解析】宣告一個函式模板的格式template<模板形參表宣告>函式宣告。呼叫模板函式時,如果與模板實參中最後的若干個引數有關的資訊可以從模板函式的實參中獲得,則相關的模板實參可以省略。

17.D。【解析】語句p=&my;是把物件my的地址值賦給指標變數P。語句MyClass*P,my;,由於P只是一個指向物件的指標,因此定義指標P不呼叫建構函式,所以此語句只調用一次建構函式。對成員函式的引用可以通過兩種形式:指標->成員函式(形參表)或者物件名.成員函式名(形參表)。

18.D。【解析】本題考查break語句的使用。break可以結束switch語句和for迴圈語旬,但是不能使用在條件判斷語句內。

19.B。【解析】本題考核運算子的過載。假定已經作為某個類的成員函式過載了二元運算子+,且c1、c2都是該類的物件,則c1.operator+(c2)與c1+c2含義相同。如果+作為該類的非成員函式過載,則operator+(c1,c2)與c1+c2含義相同。同理,運算子“/”作為友元函式過載,則(--x)/y與表示式operator/((…x),y)相同。字首運算子“--”作為友元函式過載,則--x與operator--(x)相同,所以組合起來是operator/(operator--(x),y);,即B選項。

20.A。【解析】本題考查const修飾符的作用。注意,const位置不同,其修飾的部分也是不同的。本題中const修飾的是ptr所指的物件本身,所以,ptr可以重新指向新的物件,而ptr->a則無法被更新。

21.D。【解析】只有公有繼承的公有成員才能被派生類的物件直接訪問,其他的情況都會因為訪問許可權問題產生錯誤。

22.C。【解析】本題考查考生對拷貝建構函式的掌握。因為++運算是右結合的,所以在使用a對b賦值時,b的hum變為1,而a的num變為2(先賦值再自加)。

23.D。【解析】本題考查cin流物件的幾種成員函式get,getline,read及流提取符>>的使用規則。

24.C。【解析】由主函式main入手,定義TestClass類的物件cs1,執行cs1.va1,其中va1為靜態變數,根據intTestClass::val=0;初始化,TestClass中的TestClass(){val++;}建構函式執行後,val值為1。主函式中接著定義物件cs2,cs3,cs4。執行cout<<cs2.va1<<endl;中的val值為4,所以輸出為14。

25.B。【解析】本題考查建構函式的應用。物件建立用初始化列表對資料成員進行時。列表中的引數型別要與建構函式中形參型別一致。B選項中第二個引數為13301111155,是字串,而建構函式中第二個形參為char型,兩者不一致造成錯誤。

26.D。【解析】宣告派生類的一般形成為class派生類名:[繼承方式]基類名。其中繼承方式包括public、private和protected。而virtual為C++中的關鍵字,所以選項C錯。虛擬函式的使用方法是在基類用virtual宣告成員函式為虛擬函式。

27.D。【解析】本題考查的是友元類的定義:類A為類B的友元類,則類A的所有成員函式都是類B的友元函式,但反之則不一定成立。

28.B。【解析】虛基類的引入就是為了消除二義性,其建構函式的呼叫仍然是按照繼承的順序進行的,對於多個虛基類則按它們說明的次序呼叫,虛基類的建構函式先於非虛基類的建構函式執行。

29.C。【解析】編譯時的多型性是通過函式過載和模板體現的,執行時的多型性是通過虛擬函式體現的。

30.D。【解析】首先定義TestClass3的物件obj,引數為10。其中TestClass3為TestClass1和TestClass2的派生類。然後呼叫disp成員函式。disp中首先執行TestClassl::disp();,然後執行TestClass2::disp();,最後執行輸出語句cout<<c<<endl;。testclassl(k-2),所以第一個輸出為8,testclass2(k+2),第二個輸出為12,最後一個本類中的輸出即為10。

31.D。【解析】由主函式main入手,定義了類D物件obi。其中D為類B和C的公有繼承,A是C的

虛基類。題目中要求的輸出結果為ABCD,依次為類A、類B、類C、類D中建構函式的輸出語句。為了保證基類通過多條路徑被派生類繼承,即保證A只被繼承一次,輸出一個A,所以不但需要宣告A為C的虛基類,同樣也要宣告A為B的虛基類。

32.B。【解析】所謂函式過載,是指同一個函式名可以對應著多個函式的實現,類AA中定義了兩個9et()函式,一個為普通成員函式,另一個為常成員函式。一般物件a既可以呼叫普通成員函式get,也可以呼叫常成員函式get,但是由於常成員函式不能更新物件的資料成員,所以題中通過物件a呼叫的函式為普通成員函式get(),返回值為5。常物件b只能呼叫常成員函式,所以題中通過物件b呼叫的函式為常成員函式get(),返回值為7。

33.C。【解析】函式Demo()為建構函式,而Demo(constDemo&x)為複製建構函式。C++在建立一個物件時,會自動呼叫類的建構函式,所以語句"Demoa,d;"將呼叫函式Demo()2次。當一個物件作為實參傳遞給函式時為初始化形參,要呼叫拷貝建構函式;在函式返回一個物件時呼叫拷貝建構函式。由此可知語句d=userCode(a);呼叫拷貝建構函式3次。

34.C。【解析】本題考查的是解構函式和物件的生存期。在主函式中,首先定義了一個DA類物件陣列d,從初始化列表中可以看出,它包含三個物件;然後通過new運算子動態建立了一個DA類的物件陣列,並將首地址賦給DA類指標P;接著通過[]運算子銷燬指標P所指向的陣列,故此時會輸出11。最後函式結束,銷燬前面定義的物件陣列d,會輸出333。故最後的輸出結果是11333。

35.D。【解析】在建立類物件時,建構函式的執行順序如下:執行基類的建構函式,呼叫順序按照各個基類被繼承的宣告順序;執行成員物件的建構函式,呼叫順序按照各個成員在類中的宣告順序;執行自身的建構函式。根據以上總結以及題意可知答案選擇D選項。

36.B。【解析】<返回型別>又稱函式型別,表示一個

函式所計算(或執行)的結果值型別,這裡的型別可以是預定義型別(如int)、複合型別(如double*)、使用者定義型別(如列舉類),若返回值只做更新(或設定)等操作,則該函式返回型別為void型別,函式型別和內建陣列不能作為返回型別,但類型別和容器型別可以被直接返回。

37.D。【解析】建構函式在物件被建立時由系統自動呼叫,本題共建立3個物件。

38.C。【解析】派生類從基類保護繼承classYY:pro-tectedXX時,基類的公有成員在派生類中變為保護成員,基類的保護成員在派生類中仍然是保護成員;本題中YY本身有一個保護成員y2,再加上基類XX的x2和x3,故選C。

39.A。【解析】運算子的過載是針對C++中原有運算子進行的,不能通過過載創造新的運算子。

40.D。【解析】類模板是一系列相關類的模板,類成員組成相同,成員函式的原始碼形式相同,所不同的是所針對的型別。類模板的成員函式都是模板函式,在用類模板定義物件時,由於沒有像函式實參表這樣的額外資訊渠道,因此無法按函式模板的方式省略模板實參。但可以為類模板的引數設定預設值。由此可知應選D。