61-70

注:以下問題的部分解析並非全部是自己原創,只是爲了便於以後複習,直接粘貼總結的答案,主要來源是七月在線中的解析部分。https://www.julyedu.com/question/selectAnalyze/kp_id/4/cate/C

1、下列關於一個類的靜態成員的描述中,不正確的是( )

A 該類的對象共享其靜態成員變量的值
B 靜態成員變量可被該類的所有方法訪問
C 該類的靜態方法只能訪問該類的靜態成員變量
D 該類的靜態數據成員變量的值不可修改

解釋:選D

用static關鍵字修飾的數據成員爲靜態成員。
普通成員每一個對象都回創建一個,但靜態成員是被同類的所有對象共享,可以被類的所有方法訪問。
靜態方法只能訪問靜態方法和靜態成員,不能訪問任何非靜態方法和和非靜態成員。
若靜態成員變量沒有被const修飾,則其值是可以修改的。
補充:靜態成員只能在類外進行初始化,只有靜態常量整型數據成員才能在類中初始化。
普通成員只有在創建了對象之後纔可以存在,但靜態成員只要創建了類,便存在了。
普通成員的調用方法爲對象名.成員名,靜態成員還可以直接用類名作用域的方法調用
類名::成員名

2、C++將父類的析構函數定義爲虛函數,下列正確的是哪個( )

A 釋放父類指針時能正確釋放子類對象
B 釋放子類指針時能正確釋放父類對象
C 這樣做是錯誤的
D 以上全錯

解釋:選A

當創建一個父類的指針調用子類的對象時(CFather *fa = new CSon),若父類的析構函數不是虛函數時,釋放父類指針時只會調用父類的析構函數;若父類的析構函數是虛函數時,將會先調用子類的析構函數,在調用父類的析構函數。

3、以下關於STL的描述中,( )是錯的。

A STL容器是線程安全的
B 當容量不夠時,vector內部內存擴展方式是翻倍
C std::sort可以是不穩定排序
D std::string中可以存儲多個’\0’字符
E std::bitset是一個存儲bit的STL容器
F std::stack默認是用deque實現的

解釋:選A

STL容器沒有規定一定是線程安全,所以如果是多個寫操作,使用時需要由程序員加鎖來保證一致性。
容量不夠是,一種vector的實現方案的確是翻倍,當然也有擴大爲原來的1.5倍等其他方案。std::sort的一種實現方案是當數據量大時,使用快速排序;如果數量中等,使用堆排序;如果少量數據,則使用插入排序;因此,它不是穩定的排序方案。
std::string有長度字段,不以’\0’字符作爲結束標誌。
std::bitset是記錄0、1標誌的容器,但需要初始化時指定長度,功能上類似壓縮的0/1數組。
deque是雙向隊列,一般是分塊連續的;在實現時,往往使用deque來實現堆棧std::stack。

4、程序出錯在什麼階段( )

#include < iostream >
using namespace std;
int main(int argc,char**argv)
{
http://www.sougou.com
cout<< “welcome to sogou”<< endl;
return 0;
}
A 編譯階段出錯
B 運行階段出錯
C 編譯和運行都出錯
D 程序運行正常

解釋:選D

本題中的網址比較迷惑人,在C++中,單行註釋以雙斜槓(//)開頭,即"www.sougou.com"是註釋內容。
而前面http是標籤,標籤命名規則和變量相同,後面跟一個冒號(:),標籤提供了表示特定語句的方式,使用goto label(label表示標籤名)可以無條件跳轉到該語句。

5、下面程序執行結果爲【說明:x86_64環境】( )

int a[4][4] =
{
{ 1, 2, 3, 4 },
{ 50, 60, 70, 80 },
{ 900, 1000, 1100, 1200 },
{ 13000, 14000, 15000, 16000 }
};
int (*p1)[4] = a;
int (*p2)[4] = &a[0];
int *p3 = &a[0][0];

printf(“%d, %d, %d, %d\n”,
* ( *(a + 1) - 1),
* ( * (p1 + 3) - 2) + 1,
* ( *(p2 - 1) + 16) + 2,
* (p3 + sizeof(p1)-3));
A 16000,1101,13002,2
B 4,2,3,60
C 16000,2,3,2
D 4,1101,13002,60

解釋:選D

a+1指向第二行 * (a+1)指向第二行第一列,( * (a + 1) - 1)指向第一行最後一列,故* ( * (a + 1) - 1)爲4;
指針p1是一個指向含有4個元素的數組的指針,即數組指針。當p1與整數加減時,以4個整型值長度爲單位進行調整, p1+3指向第四行, * (p1+3)指向第四行第一列,* (p1+3)-2 將指向第三行倒數第二列,故* ( * (p1 + 3) - 2) + 1爲1101;
指針p2和指針p1類型相同,初始值也都是數組a的首地址,分析同p2;
指針p3是指向單個整型元素的指針,與整數加減時以1個整型值長度爲單位來調整, 對於第4個輸出值,指針p1的大小在x86_64環境下爲8個字節,* (p3 + 8 – 3)結果爲60。
在不同的系統環境中,指針類型:32位系統4字節,64位系統8字節。

6、void func()

{
char b[2] = {0};
strcpy(b,“aaaa”);
}
以下說法哪個正確( )
A Debug版崩潰,Release版正常
B Debug版正常,Release版崩潰
C Debug版崩潰,Release版崩潰
D Debug版正常,Release版正常

解釋:選A

func函數中,申請了2個char大小的內存空間,而實際寫入的數據超出申請空間,執行strcpy函數雖然將數據寫入但是破壞了後續的空間,在函數返回前收回申請空間時發現內存訪問越界。由於Debug版中,存在相應的保護機制檢查是否內存訪問越界,而Release版則不會進行相應的檢查,故前者崩潰,後者正常。

7、在x86_64環境下,int(*b)[10][10]; sizeof(b)=( )

A 8
B 40
C 80
D 400
E 800

解釋:選A

b爲一個指向二維數組的指針,即數組指針,故其大小爲指針的大小,在該環境下爲8。

8、在面向對象軟件開發中,封裝是一種( )技術,其目的是使對象的使用者和生產者分離。

A 接口管理
B 信息隱藏
C 多態
D 聚合

解釋:選B

9、聲明一個指向含有10個元素的數組的指針,其中每個元素是一個函數指針,該函數的返回值是int,參數是int*,正確的是( )

A (int * p[10])(int*);
B int [10]* p(int*);
C int (* (* p)[10])(int*);
D int ((int*)[10])*p;

解釋:選C

首先區分一下數組指針和指針數組。int (* p)[10]是一個數組指針,p是一個指針指向 int[10]數組, int* p[10]是一個指針數組,p是一個數組,數組每個元素是個指向int型的指針。
一個指向含有10個元素的數組的指針就是(* p)[10]。返回值是int,參數是int* 的函數指針的定義爲int ( * pf)(int * ) ,然後把( * p)[10]作爲一個整體替代 pf,即int( * ( * p)[10]))(int * )。
對於複雜指針的解析,有一個“右左法則”。對於C選項中的int ( * ( * p)[10])(int*),可以進行如下解析:首先找到那個未定義的標識符,就是p,它的外面是圓括號,左邊是*,說明p是一個指針,然後(* p)右面是[],所以是數組指針, * p指向一個int[10]數組。再看左邊,是個 * 號,表明數組的每個元素爲一個指針。出括號再看右側是(int * ),說明這是一個函數指針,所以這個數組中每個元素是函數指針,該函數的參數是int*,返回值是int

10、下面描述中,正確的是( )

A 基類定義的public成員在公有繼承的派生類中可見,也能在類外被訪問
B 基類定義的public和protected成員在私有繼承的派生類中可見,在類外可以被訪問
C 基類定義的public和protected成員在保護繼承的派生類中不可見
D 基類定義的protected成員在保護繼承的派生類中可見,也能在類外被訪問

解釋:選A

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章