c++復習題
(1)標準輸入流cin:istream類的對象。(2)標準輸出流cout:ostream類的對象。
(3)非緩沖型標準出錯流cerr:ostream類的對象。(4)緩沖型標準出錯流clog:ostream類的對象
(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類中有兩個參數的函數的一個指針。
P=Test::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++復習題