當前位置:編程學習大全網 - 編程語言 - C和C++經典筆試題附答案解析

C和C++經典筆試題附答案解析

C和C++經典筆試題附答案解析

 1. 用預處理指令#define聲明壹個常數,用以表明1年中有多少秒(忽略閏年問題)。

 答案:#define SECONDS_PER_YEAR(60*60*24*365)UL

 應該意識到表達式將使壹個16位機的整形數溢出,因此要用到長整型符號L,表達式中UL表示無符號長整型。

 2. 寫壹個?標準?宏MIN,這個宏輸入連個參數並返回較小的壹個。

 答案:#define MIN(A,B) ((A)<=(B)?(A):(B));懂得在宏中小心的吧參數用括號擴起來

 3. sizeof 的壹些考察

 char* ss1=?0123456789?; char ss2[]=?0123456789?; char ss3[100]=?0123456789?;

 int ss4[100]; char q1[]=?abc?; char q2[]=?a\n?; char* q3=?a\n?;

 答案:ss1是壹個字符指針,指針的大小是壹個確定的值,就是4,sizeof(ss1)=4;

 ss2是壹個字符數組,這個數組最初的大小未定,填充值是?0123456789?,壹個字符占壹位,再加上隱含的?\0?壹***是11位。

 ss3是壹個字符數組,這個數組開始預分配100,所以它的大小是100位。

 ss4是壹個整型數組,但是每個整型變量所占空間是4,所以它的大小壹***是400位。

 q1與ss2類似,占4位。Q2裏面有壹個?\n?,?\n?算作壹位,加上隱含的,大小壹***是3位。Q3是壹個字符指針,指針得大小是壹個定值,就是4.

 4. What is the output of the following code?

 #include

 using namespace std;

 class A {};

 class A2 {char d,e;};

 struct B{};

 struct C{ char x,y;};

 struct D{int x,y;};

 main()

 {

 cout< cout< A *p1=new A();

 A p2;

 A*p3;

 cout< cout< cout< cout< cout< cout< return 0;

 }

 答案:對於壹個類而言,即便它是壹個空的類,編譯器仍然要要給它壹個空間,所以類A即便什麽也沒有,它的空間大小依然為1,而類A2大小是類中連個字符 d,e之和,所以它的空間大小依然是2,至於p1,p2,p3,p1和p3是指針,大小是壹致的,而且是定值,為4,p2是A的對象,所以它的大小和類A 相等,為1,B和C得解釋同A和A2,至於D,它和C不同點在於,結構體有兩個整型變量,每個整型變量所占空間為4,所以D所占空間大小為8。

 最後結果是 1, 2,4, 1,4,1,2,8

 5. what is the output the following code?

 #include using namespace std;

 class A1 { public: int a; static int b;A1(); ~A1();}; 4

 class A2 { public: int a; char c; A2(); ~A2();}; 8

 class A3 { public: float a; char c; A3(); ~A3();}; 8

 class A4 { public: float a; int b; char c; A4(); ~A4();}; 12

 class A5 { public: double d; float a; int b; char c; A5(); ~A5();} 24

 int main() { cout< 答案:因為靜態變量是存放在全局數據區的,sizeof計算棧中分配的大小,是不會計算在內的,所以sizeof(A1)是4;為了照顧數據對其,int 大小為4,char大小為1,所以sizeof(A2)是8;為了照顧數據對其,float大小為4,char大小為1,所以sizeof(A3)為8;為了照顧數據對其,float大小為4,int大小為4,char大小為1,所以sizeof(A4)為12;為了照顧數據對其,double大小為 8,float大小為4,int大小為4,char大小為1,所以sizeof(A5)為24。

 6. 以下代碼的輸出結果是()

 char var[]

 Int test(char var[]){ retrun sizeof(var);}

 答案:因為var[]等價於*var,已經退化成壹個指針了,所以大小是4.

 7. 以下代碼的輸出結果是()

 Class B { float f; char p; int asf[3];}; cout< 答案:float f占了4個字節,char p占了壹個字節,int adf[3]占了12個字節,總***是17個,根據內存的對齊原則,要選擇4的倍數,是20個字節。

 8. 以下代碼的輸出結果是()

 Class B { double d; char p; int asf[4];}; cout< 答案:double d占了8個字節,char p占了壹個字節,int adf[4]占了16個字節,總***是25個,根據內存的對齊原則,要選擇8的倍數,是32個字節。

 9. 壹個空類所占空間為1,多重繼承的空類所占的空間還是1,但是虛繼承涉及到虛表(虛指針),所以虛繼承的空類占的空間為4

 10. this指針是在實例化壹個對象後產生的,並且指向對象本身.比如實例化壹個對象pt,那麽this=&pt;用?&?取地址符來取對象的地址.同樣,如果定義對象pt這個類中,有壹個public變量x,那麽就可以用this->x=0來定義x的值,等同於pt.x=0.

 11. #include using namespace std;

 Void GetMemory(int *z) { *z=5; }

 Int main() { int v; GetMemory(&v); cout< Getmory把v的地址傳了過來,*z是地址裏的值,是v的副本.通過直接修改地址裏的值,不需要有返回值,也把v給修改了,因為v所指向地址的值發生了改變,最終程序會崩潰.

 12. 下面的數據聲明都代表什麽意思?

 (1)float(**def)[10]

 Def是壹個二級指針,它指向的是壹個壹維數組的指針,數組的元素都是float。

 (2)double*(*gh)[10]

 Gh是壹個指針,它指向壹個壹維數組,該數組元素都是double*

 (3) double(*f[10])()

 F是壹個數組,f有十個元素,元素都是函數的指針,指向的函數類型是沒有參數且返回double的函數

 (4)int*((*b)[10])

 就跟?int*(b)[10]?是壹樣的,b是壹維數組的指針

 (5)long(*fun)(int)

 函數指針

 (6)int(*(*f)(int,int))(int)

 F是壹個函數的指針,指向的函數的類型是有兩個int參數並且返回壹個函數指針的函數,返回的函數指針指向壹個int參數且返回int的'函數。

 13. 指針數組與數組指針

 指針數組,是指壹個數組裏面裝著指針,數組指針,代表它是指針,指向真個數組

 壹個指向整型數組的指針定義為()

 A. int(*ptr)[] B.int *ptr[] C.int*(ptr[]) D.int ptr[]

 int(*ptr)[]是以壹個指向整型數組的指針

 int *ptr[]是指針數組,ptr[]裏面存的的是地址。它指向位置的值就是*ptr[0],*ptr[1],*ptr[2],不要存*ptr[0]=5,*ptr[1]=6,因為裏面沒有相應的地址

 int*(ptr[])與B相同

 14. 用變量a給出下面的定義

 (1)壹個整型數

 (2)壹個指向整形數的指針

 (3)壹個指向指針的指針,它指向的指針是壹個整型數

 (4)壹個有10個整型數的數組

 (5)壹個有10個指針的數組,該指針是指向壹個整型數的

 (6)壹個指向有10個整型數組的指針

 (7)壹個指向函數的指針,該函數有壹個整型參數並返回壹個整型數

 (8)壹個有10個指針的數組,該指針指向壹個函數,該函數有壹個整型參數並返回壹個整數

 Itn a; int *a; int **a; int a[10]; int *a[10]; int (*a)[10]; int (*a)(int); int (*a[10])(int)

 15.C++中的空類默認產生那些類成員函數?

 Class Empty

 { public:

 };

 答案:對於壹個空類,編譯器默認產生4個成員函數:默認構造函數,析構函數,拷貝構造函數和賦值函數

 16.那壹種成員變量可以在同壹個類的實例之間***享?

 答案:必須使用靜態成員變量在壹個類的所有實例間***享數據.如果想限制對靜態成員變量的訪問,則必須把他們聲明成保護型或私有型.不允許使用靜態成員變量去存放壹個對象的數據。靜態成員數據是在這個類的所有對象間***享的。

 靜態數據成員:靜態成員可以實現多個對象之間的數據***享,並且使用靜態數據成員還不會破壞隱藏的原則,即保證了安全性。節省內存;提高時間效率。使用靜態數據成員可以因為它是所有對象所公有的,因此,對多個對象來說,靜態數據成員只存儲壹處,供所有對象***用。靜態數據成員的值對每個對象都是壹樣,但它的值是可以更新的。只要對靜態數據成員的值更新壹次,保證所有對象存取更新後的相同的值,

 1、靜態數據成員在定義或說明時前面加關鍵字static。

 2、靜態成員初始化與壹般數據成員初始化不同。靜態數據成員初始化的格式如下:

 <數據類型><類名>::<靜態數據成員名>=<值>

 這表明:

 (1) 初始化在類體外進行,而前面不加static,以免與壹般靜態變量或對象相混淆。

 (2) 初始化時不加該成員的訪問權限控制符private,public等。

 (3) 初始化時使用作用域運算符來標明它所屬類,靜態數據成員是類的成員,而不是對象的成員。

 3、靜態數據成員是靜態存儲的,它是靜態生存期,必須對它進行初始化。

 4、引用靜態數據成員時,采用如下格式:

 <類名>::<靜態成員名>

 靜態數據成員的訪問權限允許的話(即public的成員),可在程序中,按上述格式來引用靜態數據成員。

 下面舉壹例子,說明靜態數據成員的應用:

 #include

 class Myclass

 {

 public:

 Myclass(int a, int b, int c);

 void GetNumber();

 void GetSum();

 private:

 int A, B, C;

 static int Sum;

 };

 int Myclass::Sum = 0;

 Myclass::Myclass(int a, int b, int c)

 {

 A = a;

 B = b;

 C = c;

 Sum += A+B+C;

 }

 void Myclass::GetNumber()

 {

 cout<<?Number=?< }

 void Myclass::GetSum()

 {

 cout<<?Sum=?< }

 void main()

 {

 Myclass M(3, 7, 10),N(14, 9, 11);

 M.GetNumber();

 N.GetNumber();

 M.GetSum();

 N.GetSum();

 }

 從輸出結果可以看到Sum的值對M對象和對N對象都是相等的。這是因為在初始化M對象時,將M對象的三個int型數據成員的值求和後賦給了Sum,於是Sum保存了該值。在初始化N對象時,對將N對象的三個int型數據成員的值求和後又加到Sum已有的值上,於是Sum將保存另後的值。所以,不論是通過對象M還是通過對象N來引用的值都是壹樣的,即為54。

 靜態成員函數

 靜態成員函數和靜態數據成員壹樣,它們都屬於類的靜態成員,它們都不是對象成員。因此,對靜態成員的引用不需要用對象名。

 在靜態成員函數的實現中不能直接引用類中說明的非靜態成員,可以引用類中說明的靜態成員。如果靜態成員函數中要引用非靜態成員時,可通過對象來引用。下面通過例子來說明這壹點。

 #include

 class M

 {

 public:

 M(int a) { A=a; B+=a;}

 static void f1(M m);

 private:

 int A;

 static int B;

 };

 void M::f1(M m)

 {

 cout<<?A=?< cout<<?B=?< }

 int M::B=0;

 void main()

 {

 M P(5),Q(10);

 M::f1(P); file://調用時不用對象名

 M::f1(Q);

 }

 讀者可以自行分析其結果。從中可看出,調用靜態成員函數使用如下格式:

 <類名>::<靜態成員函數名>(<參數表>);

 17.判斷選擇

 1. C++語言沒有可移植性。 B不正確

 2. 定義數組時可以不確定元素個數。 B不正確

 3. 指針是壹種特殊的變量,只能用來保存地址。 A正確

 4. 通過引用或者指針調用對象的成員函數時,如果引用或者指針的類型跟對象的類型不壹致時,能自動正確調用對象所屬的類中對這個函數的定義。 B不正確

 5.類myclass,為myclass類對象以成員函數形式重載後++運算符的聲明應該為 C myclass operator++( int );

 A. myclass operator++();

 B. myclass& operator++();

 C. D. myclass& operator++( int );

 5. 父類和子類各自定義壹個成員函數,函數名相同,參數表不同,那麽 C子類中的函數會覆蓋父類中的函數。 函數同名,通通覆蓋,不同層次的函數不能重載

 6. 如果myclass類定義了拷貝構造函數和壹個整型參數的構造函數,還重載了賦值運算符,那麽語句

 myclass obj = 100;會 B調用整型參數的構造函數。等價於 myclass obj = myclass(100)

 7. 抽象類指的是 D有純虛函數的類

 8. 多重繼承時,如果派生類的兩個父類有壹個***同的虛基類,那麽虛基類的初始化參數由 C派生類

 的構造函數來傳遞。

 9. 多態性是通過 C虛函數 實現的。

 10. 如果有如下語句

 char str[20];

 cin >> str;

 cout << str;

 執行時輸入的是?this is a test line!?,則輸出的內容是 D 。

 A. this is a test line!

 B. this is a test line

 C. this is a test

 D. this

 11. 執行語句

 char ch[] = ?Hello?;

 char * p = &ch[0];

 cout << p;

 結果是輸出 C 。Hello

 18.以下生面是否正確?

 Class A{ const int size=0;};

 答案:常量必須在構造函數的初始化列表裏面初始化或者將其設置為static

 正確的程序如下:

 Class A

 { A(){ const int size=0; }};

 或者:

 Class A

 { static const int size=0; };

;

  • 上一篇:幼兒大班春節語言教案
  • 下一篇:JAVA EE 7有哪些主要的實現
  • copyright 2024編程學習大全網