第 1 頁:基本操作題 |
第 2 頁:簡單應用題 |
綜合應用題
3[簡答題]
使用VC6打開考生文件夾proj3下的工程proj3,其中定義了一個字符串變量類StringVar。類成員的說明在程序注釋中。請在// ******** 333 ******** 和// ******** 666 ******** 之間填寫StringVar成員函數和友元函數的實現代碼。在main函數中給出了一組測試數據,運行時輸入:
Hello Kitty
此情況下程序的輸出應該是:
Hello Kitty
Borg
Borg
注意:只需在// ******** 333 ******** 和// ******** 666 ******** 之間填入所編寫的若干語句,不要改動程序中的其他內容。
參考解析:【參考答案】
【考點分析】
本題考查構造函數和析構函數的定義、類的成員函數、重載流運算符>>和插入運算符<<和預定義流對象。
【解題思路】
由StringVar.h這個頭文件可知:頭文件中定義了StringVar類,它包含的成員信息如下:
兩個數據成員:char * 類型的value,指向字符串的首地址;int類型的max_length,表示字符串的最大長度。兩個構造函數:接收int類型的構造函數和接收const char a[]的構造函數。一個復制構造函數:用參數strobj對象的成員值給當前對象的成員賦值;
析構函數:使用delete[]釋放value指向的地址空間;length()成員函數:返回成員value指向的字符串長度;input_line()成員函數:使用輸入流參數輸入一個字符串,保存到value指向的內存空間;getValue()成員函數:常成員函數,返回value的值。
另外類定義體外部還聲明一個重載“<<”運算符函數,將StringVar對象中value指向的字符串輸出,并返回輸出流outs的引用
StringVar.h中,已經給出的定義有:析構函數、length()函數和getValue()函數,所以需要我們完成的函數定義有:構造函數、復制構造函數、input_line()函數和重載的“<<”運算符函數
①StringVar(int size);
題意指出,size為字符串長度(字符個數)初始值,字符串內容初始化為空串,所以需要使用size設置成員max_length,為value申請size個字符的存儲空間,并把value的第一個字符設置為'\0'表示空串,這樣保證析構函數的delete[]也是正確的。
②StringVar(const char a[]);
題意指出,使用參數數組a的內容初始化對象的成員,即將數組a中的內容,存放到value指向的內存空間,由于value是使用new分配的(保證析構函數的delete[]是正確的),所以不能簡單的把數組a的首地址賦給value,需要將數組a的內容復制到value指向的內存空間中,另外成員max_length,初值最小必須是value指向的內存空間長度,即value指向的字符串長度+1(題意中max_length表示字符個數的最大值,所以需要包含字符串結束符'\0')(此構造函數的形參必須傳入的是字符串,如果是字符數組,必須傳入數組的長度,以防數組a的最后一個字符不是結束符'\0',此時strlen()函數獲取的長度,就不是字符數組a的字符個數)
③StringVar(coast StringVar& strobj);
復制構造函數需要將形參strobj的成員賦給當前調用該復制構造函數的對象成員,在賦值value時,同樣需要為value分配足夠的內存空間。
④input_line(istream& ins);
input_line()函數需要使用形參ins輸入流,輸入一個字符串存放到value中,題意要求可以輸入空格,所以我們不能直接用輸入流ins和輸入運算符,因為輸入運算符會丟棄空白符、空格符和制表符,可以使用輸入流ins的成員函數:get()和while循環,逐個輸入字符存放到value下標i的字符中,直到輸入的字符為換行符或value存滿(i=max_length)為止,當這兩個條件滿足其一,那么就應該停止輸入,另外需要注意:value指向的字符串結尾,必須包含空字符'\0',所以下標max_length-1必須是空字符,循環輸入時,i取值最大為max_length-2。
⑤ostream& operator << (ostream&outs,coast StringVar the_string);
輸出運算符重載函數,題意要求將the—strin9通過輸出流outs輸出,由于the_string是StringVar對象,所以輸出的應該是對象的成員value指向的字符串,根據返回值可知,函數必須返回輸入流ostream的引用;另外由于第一形參是輸入流outs,所以無法通過StringVar對象來調用,該函數不是類的成員函數,函數定義時,不能限定StringVar作用域,由于該函數不是類的成員函數,所以使用輸出流outs輸出value指向的字符串時,不能直接使用私有成員value,而是應該使用getValue()公有成員函數,返回value的值,再輸出。
微信搜索"考試吧"了解更多考試資訊、下載備考資料
相關推薦: