程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++筆試易錯題集(持續更新),筆試錯題集

C++筆試易錯題集(持續更新),筆試錯題集

編輯:C++入門知識

C++筆試易錯題集(持續更新),筆試錯題集


1.如下代碼輸出結果是什麼? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include<stdio.h> char *myString() {     char buffer[6] = {0};     char *s = "Hello World!";     for (int i = 0; i < sizeof(buffer) - 1; i++)     {         buffer[i] = *(s + i);     }     return buffer; } int main(int argc, char **argv) {     printf("%s\n", myString());     return 0; }
  • Hello
  • Hello World!
  • Well
  • 以上全部不正確

解析:

答案:D 函數char *myString()中沒有使用new或者malloc分配內存,所有buffer數組的內存區域在棧區 隨著char *myString()的結束,棧區內存釋放,字符數組也就不存在了,所以會產生野指針,輸出結果未知    2. 1 2 3 4 5 6 7 enum string{         x1,         x2,         x3=10,         x4,         x5,     } x; 問x等於什麼?(0) 在c語言中,這樣寫法一般是全局變量,程序初始化時會清零. 3. 設已經有A,B,C,D4個類的定義,程序中A,B,C,D析構函數調用順序為? 1 2 3 4 5 6 7 8 C c; void main() {     A*pa=new A();     B b;     static D d;     delete pa; }

 

A B C D A B D C(正確) A C D B A C B D 解析: 這道題主要考察的知識點是 :全局變量,靜態局部變量,局部變量空間的堆分配和棧分配   其中全局變量和靜態局部變量時從 靜態存儲區中劃分的空間, 二者的區別在於作用域的不同,全局變量作用域大於靜態局部變量(只用於聲明它的函數中), 而之所以是先釋放 D 在釋放 C的原因是, 程序中首先調用的是 C的構造函數,然後調用的是 D 的構造函數,析構函數的調用與構造函數的調用順序剛好相反。   局部變量A 是通過 new 從系統的堆空間中分配的,程序運行結束之後,系統是不會自動回收分配給它的空間的,需要程序員手動調用 delete 來釋放。   局部變量 B 對象的空間來自於系統的棧空間,在該方法執行結束就會由系統自動通過調用析構方法將其空間釋放。   之所以是 先 A  後 B 是因為,B 是在函數執行到 結尾 "}" 的時候才調用析構函數, 而語句 delete a ; 位於函數結尾 "}" 之前。 4.若char是一字節,int是4字節,指針類型是4字節,代碼如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 class CTest {     public:         CTest():m_chData(‘\0’),m_nData(0)         {         }         virtual void mem_fun(){}     private:         char m_chData;         int m_nData;         static char s_chData; }; char CTest::s_chData=’\0’; 問: (1)若按4字節對齊sizeof(CTest)的值是多少(12)? (2)若按1字節對齊sizeof(CTest)的值是多少(9)? 請選擇正確的答案。 解析: 答案分別是:12 和 9,對應C   考察點:c++ 類的內存布局。   上精華圖:一張圖說明類中成員變量,成員函數,靜態變量與函數的空間位置。       理論如上,下面就是代碼運行後真是執行結果。無pp無真相。這是4字節對齊,結果是12= 4(虛表指針)+1(char )+3(對齊補位)+4(int)       以下是1字節對齊,結果是9 =4(虛表指針)+1(char )+4(int)   5. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include<iostream> using namespace std; class MyClass { public:     MyClass(int i = 0)     {         cout << i;     }     MyClass(const MyClass &x)     {         cout << 2;     }     MyClass &operator=(const MyClass &x)     {         cout << 3;         return *this;     }     ~MyClass()     {         cout << 4;     } }; int main() {     MyClass obj1(1), obj2(2);     MyClass obj3 = obj1;     return 0; } 運行時的輸出結果是()
  • 11214444
  • 11314444
  • 122444(正確)
  • 123444

解析:首先程序中存在三個MyClass對象。
前兩個對象構造時分別輸出1,2
第三個對象是這樣構造的MyClass obj3 = obj1;這裡會調用拷貝構造函數,輸出2
然後三個對象依次析構,輸出444
所以最終輸出122444

MyClass obj3 = obj1;這裡調用拷貝構造函數 如果是在這之前obj3,obj1都已聲明,則此時調用的是coby assignment操作符  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved