1. 程式人生 > >c++復習題

c++復習題

tro erl 關於 構造函數 hello 進制 只需要 棧空間 ace

(1)標準輸入流cin:istream類的對象。(2)標準輸出流cout:ostream類的對象。

(3)非緩沖型標準出錯流cerrostream類的對象。(4)緩沖型標準出錯流clogostream類的對象

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

A)設置虛基類的目的是為了消除二義性

B)虛基類的構造函數在非虛基類之後調用

C)若同一層中包含多個虛基類,這些虛基類的構造函數按它們說明的次序調用

D)若虛基類由非虛基類派生而來,則仍然先調用基類構造函數,再調用派生類的構造函數

extern用於聲明外部變量的register聲明寄存器類型變量

多態性有兩種靜態多態性和動態多態性

,靜態多態性是指調用同名函數,由於參數

的不同調用不同的同名函數;動態多態性是指不同對象調用同名函數時,由於對象不同調用不同

的同名函數。 多態性肯定具有相同的函數名

派生類的成員一個是來自基類,一個來自本身,所以派生類是基類的擴展,也是基

類的具體化和特殊化,派生類是對基類擴展

substr取子字符串,第1個參數表示要截取子串在字符串中的位置,第2個表示取多少個字符。

要輸出this->x=x表達式的值要加括號。

[修改]cout<<this->x=x<<endl;

#include <iostream.h>

class Test

{int x,y;

public:

Test(int i,int j=0)

{x=i;y=j;}

int get(int i,int j)

{return i+j;}

};

void main()

{Test t1(2),t2(4,6);

int (Test::*p)(int,int=10);

p=Test::get;

cout<<(t1.*p)(5)<<endl;

Test *p1=&t2;

cout<<(p1->*p)(7,20)<<endl;

}

答案:15 27

[解析]指向類成員函數的指針的使用,*p指向Test類中有兩個參數的函數的一個指針。

PTest::get.這樣p就和get發生了聯系。(t1.*p)(5)等價於調用一個參數的get函數。

9. 基類的公有成員在派生類中的訪問權限由___決定。

答案:訪問控制方式或繼承方式

13. 類模板用來表達具有___的模板類對象集。

答案:相同處理方法

[解析]模板特點是不同的數據具有相同的處理方法的抽象。

14. C++程序的源文件擴展名為___。

答案:cpp

[解析]源程序*.cpp,目標文件為*.obj,可執行程序*.exe

15. 在#include命令中所包含的頭文件,可以是系統定義的頭文件,也可以是___的頭文件。

答案:自定義

[解析]include裝入文件有兩種方式<>和“”,一是系統的,一是自定義文件。

#include <iostream.h>

void main()

{ int *p1;

int **p2=&p1;

int b=20;

p1=&b;

cout<<**p2<<endl;

}

答案:20

[解析]p1指向b,而p指向p1的地址。*p2表示p1的地址,p1的地址就是&b,即*p2是&b,所以

**p2就是b變量的值。

#include <iostream>

#include <string.h>

using namespace std;

class mystring

{public:

char * pdata;

mystring(int len)

{pdata=new char[len+1];

}

~mystring()

{delete pdata;}

void show(){cout<<pdata<<endl;}

};

void fun(mystring** array,int len)

{mystring*old=*array;

_______;

memcpy(*array, old, len);

}

void main()

{mystring str(20);

mystring*pstr=&str;

mystring**ppstr=&pstr;

strcpy(str.pdata,"hello,andylin");

fun(ppstr, 20);

_______

}

答案:*array=new mystring(len);,(**ppstr).show();或str.show();

[解析]調用mystring類的構造函數開辟空間,後進行字符的復制。輸出可以直接使用str或者

使用二級指針。

#include <iostream>

#include <string>

using namespace std;

template<class T>

void Swap(T& a,T& b)

{T temp;

 temp=a,a=b,b=temp;

}

void main()

{int a=5,b=9;

char s1[]="Hello",s2[]="hi";

Swap(a,b);

Swap(s1,s2);

cout<<"a="<<a<<",b="<<b<<endl;

cout<<"s1="<<s1<<",s2="<<s2<<endl;

}

答案:char s1[]="Hello",s2[]="hi";使用Swap(s1,s2)調用交換的是地址。字符指針作實

參,形參值發生改變,實參也就發生變化。

 [修改]char *s1="Hello",*s2="hi";

ios::binary,采用二進制形式ios::app定位到文件尾部。

對於int *pa[5];的描述,正確的是()

A. pa是一個指向數組的指針,所指向的數組是5個int型元素

B. pa是一個指向某個數組中第5個元素的指針,該元素是int型變量

C. pa[5]表示某個數組的第5個元素的值

D. pa是一個具有5個元素的指針數組,每個元素是一個int型指針

答案:D

解析:指針數組:數組元素都是相同類型的指針,相同類型的指針是說指針所指向的對象

類型是相同的。例如,語句int *pa[5];定義了一個指針數組。在指針數組的定義中有兩個運

算符:*和[],運算符[]的優先級高於*,所以*pa[5]等價於*(pa[5]),pa[5]表示一

個數組,而*表示後面的對象為指針變量,合在一起*pa[5]表示一個指針數組。該數組包含5個

元素,每個元素都是指向int型的指針。所以選擇D選項。

3. 設類A有成員函數void f(void);若要定義一個指向類成員函數的指針變量pf來指向f,該

指針變量的聲明語句是:___。

答案:void (A::*pf)(void)=&A::f;

[解析]void(A::*pf)(void)=&A::f;指向成員函數的指針,它相當於兩條語句

:void(A::*pf)(void);和pf=&A::f;。

重載的運算符保持其原有的___、優先級和結合性不變。

答案:操作數

istream和ostream的直接基類是ios。

定義向量列表vector<int>A(10,1),使用兩個參數,10表示長度,1表示數值。

在C++中有兩種參數傳遞方式:傳值和___。

答案:傳引用

[解析](1)傳值調用又分為數據傳值調用和地址傳值調用。

#include <iostream.h>

void main()

{int a,b,c;

char ch;

cin>>a>>ch>>b>>c;//從鍵盤上輸入1.5×c×10×20,×表示一個空格

cout<<a<<endl<<ch<<endl<<b<<endl<<c<<endl;

}

答案:1

.

5

0

[解析]使用cin進行輸入字符的輸入的問題。1-->a,.-->ch,5-->b,空格轉換為零給了c。

函數調用func((exp1,exp2),(exp3,exp4,exp5))中所含實參的個數為()

A. 1

B. 2

C. 4

D. 5

答案:B

解析:(exp1,exp2)、(exp3,exp4,exp5)表示是兩個逗號表達式,值是最後一個值,相當於兩個

參數。因此實參的個數是2。

普通成員函數可以調用靜態函數,相反靜態函數不能調用普通成員函數,這與普通

函數與常成員函數相同。

13. 在編譯指令中,宏定義使用哪個指令()

A. #if

B. #include

C. #define

D. #error

答案:C

解析: #if條件編譯,#include文件包含,#error錯誤處理。

:除了類屬關系運算符"."、成員指針運算符".*"、作用域運算符"::"、sizeof運算

符和三目運算符"?:"以外,C++中的所有運算符都可以重載。

20. 在C++語言中,數據封裝要解決的問題是()

A. 數據的規範化

B. 便於數據轉換

C. 避免數據丟失

D. 防止不同模塊之間數據的非法訪問

答案:D

解析:封裝是指把對象屬性和操作結合在一起,構成獨立的單元,它的內部信息對外界是

隱蔽的,不允許外界直接存取對象的屬性,只能通過有限的接口與對象發生聯系。類是數據封裝

的工具,對象是封裝的實現。類的訪問控制機制體現在類的成員中可以有公有成員、私有成員和

保護成員。對於外界而言,只需要知道對象所表現的外部行為,而不必了解內部實現細節。封裝

體現了面向對象方法的“信息隱蔽和局部化原則”。

C++派生類使用兩種基本的面向對象技術:第一種稱為性質約束,即對基類的性質加以限制

;第二種稱為___,即增加派生類的性質。

答案:性質擴展

[解析]派生類通過繼承可以從基類中獲得成員,也可以自定義成員。

6. 面向對象的四個基本特性是多態性、繼承性、和封裝性___。

答案:抽象

答案:(*this).x=x; (*this).y=y;,cout<<x<<"+"<<y<<"="<<x+y<<endl;

[解析]形參同數據成員同名,使用this來訪問。

#include<iostream.h>

class a

{public:

a(int i=10){x=i;cout<<"a:"<<x<<endl;}

int x;

};

class b:public a

{public:

b(int i):A(i){x=i;cout<<"b:"<<x<<", "<<a::x<<endl;}

private:

a A;

int x;

};

void main()

{b B(5);

}

答案:a:10

a:5

b:5,10

[解析]定義對象B,先調用基類構造函數,在b構造函數中使用的是A(i),註意大小寫,不

是a(i),也就是說調用基類的構造函數時沒有實參值,所以采用默認值;在初始化類成員A,即

A(i),i=5,所以輸入為a:5;最後是b類的構造函數,x=5,來自基類x=10,輸出b:5,10。

(1)全局變量:在函數外部定義的變量稱為全局變量,其作用域為:從定義變量的位置開始

到源程序結束。全局變量增加了函數之間數據聯系的渠道,全局變量作用域內的函數,均可使用

、修改該全局變量的值,但是使用全局變量降低了程序的可理解性,軟件工程學提倡盡量避免使

用全局變量。

(2)局部變量:在函數內部定義的變量稱為局部變量,其作用域為:從定義變量的位置開始

到函數結束。局部變量包含自動變量(auto)靜態變量(static)以及函數參數。

auto變量意味著變量的存儲空間的分配與釋放是自動進行的。說明符auto可以省略。函數中

的局部變量存放在棧空間。在函數開始運行時,局部變量被分配內存單元,函數結束時,局部變

量釋放內存單元。因此,任兩個函數中的局部變量可以同名,因其占有不同的內存單元而不影響

使用。這有利於實現軟件開發的模塊化。

static變量是定義在函數體內的變量,存放在靜態存儲區,不用棧空間存儲,其值並不隨存

儲空間的釋放而消失。

運算符的重載,前綴先讓變量變化。調用++a,等價為a.operator++(),註意無參

的形式。後綴的話a++,等價於a.operator(0),帶形參,形參名可省。

8. 解決定義二義性問題的方法有()

A. 只能使用作用域分辨運算符

B. 使用作用域分辨運算符或成員名限定

C. 使用作用域分辨運算符或虛基類

D. 使用成員名限定或賦值兼容規則

答案:B

解析:解決二義性問題主要要兩種方法:(1)賦值兼容規則;(2)虛基類。

cin、cout、cerr和clog中cin用於輸入,cout用於輸出,cerr、clog錯誤處理。

int a=32;

double c=32;

cout.setf(ios::hex);

cout<<"hex:a="<<a<<",c="<<c<<endl;

cout.unsetf(ios::hex);

程序的輸出結果為___。

答案: hex:a=20,c=32

[解析]用十六進制只能輸出整型數據,而不能將其它類型數據轉換成十六進制的數據輸出。所

以double類型不變仍然是32(double類型)。

類成員包括成員函數和數據成員,都可以使用訪問權限public、private和protected來修

飾,而普通的變量不能使用訪問權限來說明。

10. 下列有關模板和繼承的敘述正確的是 ()

A. 模板和繼承都可以派生出一個類系

B. 從類系的成員看,模板類系的成員比繼承類系的成員較為穩定

C. 從動態性能看, 繼承類系比模板類系具有更多的動態特性

D. 相同類模板的不同實例一般沒有聯系,而派生類各種類之間有兄弟父子等關系

答案:D

解析:類是相同類型事物的抽象,具有不同的操作。而模板是不同類型的事物,具體相同

的操作的抽象。類模板的實例化後,各個對象沒有任何關系。而類對象是通過派生、繼承等關系

的關系。

13. 類模板用來表達具有___的模板類對象集。

答案:相同處理方法

[解析]模板特點是不同的數據具有相同的處理方法的抽象。

14. 如果通過同一個基類派生一系列的類,則將這些類總稱為___。

答案:類族

[解析]單繼承方式派生的眾多的類。

15. 面向對象的四個基本特性是多態性、繼承性、和封裝性___。

答案:抽象

string str("HelloC++");

cout<<str.substr(5,3);

程序的輸出結果是___。

答案: C++

c++復習題