標籤:c++
序
C++基礎專項練習二,,,水平依然不到家!
錯題分析與總結
1 . 有如下模板定義:
template <class T>T fun(T x,T y){ return x*x+y*y;}
在下列對fun的調用中,錯誤的是()
A. fun(1, 2)
B. fun(1.0, 2)
C. fun(2.0, 1.0)
D. fun(1, 2.0)
分析:這是一道C++模板的題目,模板函數的調用,這裡主要是要求函數參數傳回值的類型一致;
對於選項A,參數都是int類型,符合要求;選項B,參數為浮點型與整型,類型不一致,錯誤;選項C,參數都是浮點型,類型一致;選項D,通過強制類型轉換,將參數都轉換為浮點型,類型一致;
答案:B
總結:錯選D,對模板函數的調用瞭解不透徹;
2 . c++中,聲明const int i,是在哪個階段做到 i只可讀的?
A. 編譯
B. 連結
C. 運行
D. 以上都不對
分析:const用來說明所定義的變數是唯讀。 這些在編譯期間完成,編譯器可能使用常數直接替換掉對此變數的引用。
答案:A
總結:錯選C
3 .類成員函數的重載、覆蓋和隱藏區別描述正確的有?
A .覆蓋是指在同一個類中名字相同,參數不同
B .重載是指衍生類別函數覆蓋基類函數,函數相同,參數相同,基類函數必須有virtual關鍵字
C .衍生類別函數與基類函數相同,但是參數不同,會”隱藏”父類函數
D .函數名字相同,參數相同,基類無virtual關鍵字的衍生類別的函數會”隱藏”父類函數
分析:關於類成員函數的重載、覆蓋和隱藏概念非常相似,下面總結如下:
a.成員函數被重載的特徵:
(1)相同的範圍(在同一個類中);
(2)函數名字相同;
(3)參數不同;
(4)virtual 關鍵字可有可無。
b.覆蓋是指衍生類別函數覆蓋基類函數,特徵是:
(1)不同的範圍(分別位於衍生類別與基類);
(2)函數名字相同;
(3)參數相同;
(4)基類函數必須有virtual 關鍵字。
c.“隱藏”是指衍生類別的函數屏蔽了與其同名的基類函數,規則如下:
(1)如果衍生類別的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
(2)如果衍生類別的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual 關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)
答案: CD 此題是多項選擇
4 .下面這個程式執行後會有什麼錯誤或者效果:
#define MAX 255int main(){ unsigned char A[MAX], i; for (i = 0; i <= MAX; i++) A[i] = i;}
A. 數組越界
B. 死迴圈
C. 棧溢出
D. 記憶體泄露
分析: 死迴圈加數組越界訪問(C/C++不進行數組越界檢查 MAX=255;
(1)數組A的下標範圍為:0….MAX-1;
(2)當i迴圈到255時,迴圈內執行: A[255]=255;這句本身沒有問題,但是返回for (i=0;i<=MAX;i++)語句時,由於unsigned char的取值範圍在(0..255),i++以後i又為0了,這樣就會無限迴圈下去,造成了死迴圈;
答案: AB
5 .關於static用途說法正確的是?
A .聲明靜態外部類
B .聲明靜態外部全域變數
C .聲明靜態外部函數
D .聲明靜態局部變數
分析:型別宣告符在C語言裡面主要有三個用途:
1:設定靜態局部變數,變數只定義一次,不能被別的函數使用
2:設定靜態全域變數,變數不能被外部檔案所使用
3:在類中設定靜態函數,只能訪問靜態變數
答案:BCD
6 .請找出下面代碼中的所有錯誤。說明:以下代碼是把一個字串倒序,如“abcd”倒序後變為“dcba”?
1 #include "string.h"2 int main() 3 {4 char *src = "hello,world";5 char *dest = NULL;6 int len = strlen(src);7 dest = (char *)malloc(len);8 char *d = dest;9 char *s = src[len];10 while (len-- != 0)11 d++ = s--;12 printf("%s", dest);13 return 0;14 }
A .第7行要為’\0’分配一個空間
B .第9行改成char * s = &src[len-1]
C .第12行前要加上*d = 0;
D .第13行前要加上free(dest)釋放空間
分析:
int main() { char *src = "hello,world"; int len = strlen(src); char *dest = (char *)malloc(len + 1); //要為\0分配一個空間 char *d = dest; char *s = &src[len - 1]; //指向最後一個字元 while ( len-- != 0 ) *d++ = *s--; *d = 0; //尾部要加\0 printf("%s\n", dest); free(dest);// 使用完,應當釋放空間,以免造成記憶體匯泄露 return 0; }
答案:ABCD
精題收藏
1 . 下列一段C++代碼的輸出是?
#include "stdio.h"class Base { public: int Bar(char x) { return (int)(x); } virtual int Bar(int x) { return (2 * x); } }; class Derived : public Base { public: int Bar(char x) { return (int)(-x); } int Bar(int x) { return (x / 2); } }; int main(void) { Derived Obj; Base *pObj = &Obj; printf("%d,", pObj->Bar((char)(100))); printf("%d,", pObj->Bar(100)); }
A .100,-100
B .100,50
C .200,-100
D .200,50
分析:
Derived Obj;
Base *pObj = &Obj;
printf(“%d,”, pObj->Bar((char)(100)))
printf(“%d,”, pObj->Bar(100));
第一個Bar(char)是非虛函數,因此是靜態繫結,靜態繫結是指指標指向聲明時的對象,pObj聲明時為Base類,因此調用的是Base類的Bar(char)
第二個Bar(char)是虛函數,因此是動態綁定,動態綁定是指指標指向引用的對象,pObj引用Derived對象,因此調用的是Derived類的Bar(int)
《C++專項練習》 — (2)