101-110

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

1、 在C++語言中,若要對Data類中重載的加法運算符成員函數進行聲明,下列選項中正確的是( )

A Data+operator(Data);
B Data+(Data);
C Data operator+(Data);
D Data operator+(Data,Data);

解釋:選C

運算符重載聲明形式爲:返回類型 operator運算符(參數表);由於加法是二目運算符,作爲類成員函數,默認已經有一個參數this指針,還需要一個數據做“被加數”,因此參數列表中Data的數目是1個。此外,使用友元函數也能夠達到同樣的目的,其聲明爲friend Data operator+(Data,Data),因爲友元函數不是類的成員函數,沒有this指針,其形參數目與運算符需要的數目相同。

2、 以下涉及到內存管理的代碼段中,有錯誤的是( )

A int *a = new int(12);
//…
free(a);
B int *ip = static_cast(malloc( sizeof(int)));
*ip = 10;
//…
delete ip;
C double *a = new double[1];
//…
delete a;
D int *ip = new int(12);
for(int i=0;i<12; ++i)
{
ip[i] = i;
}
delete []ip;

解釋:選D

malloc函數用於申請一塊內存空間,申請成功是返回類型爲void* 的內存地址,反之返回NULL,而free用來釋放malloc申請的內存空間。
new關鍵字創建對象時,首先申請了一塊內存空間(默認調用malloc),然後調用構造函數,最後返回正確的指針,而delete則執行反向過程,即先調用析構函數,然後釋放申請空間(默認調用free)。
選項A,a爲簡單類型,使用new時無需調用構造函數,故在釋放空間時也無需調用析構函數,故使用free雖不至出錯,但強烈不推薦。
選項B,delete會先調用析構函數然後釋放內存空間,而簡單類型不存在構造函數,故delete直接釋放了由malloc申請的內存空間。與A選項相同,B選項也是new-delete和malloc-free混用的情況,強烈不推薦。
選項C,使用new[]創建的a爲簡單類型,使用delete和delete[]釋放該空間效果相同,而對於對象數組,delete[]會爲對數組中每個對象調用析構函數,而delete則不會。要說明的是,因爲double是基本數據類型,所有new[]和delete可以混用,但正常情況應該是new[]和delete[]搭配。
選項D,int* ip = new int(12)實際上只申請了一個int長度的內存,並且初始化爲12;後面的for循環顯然越界了,故在執行delete[]時會發生錯誤。

3、 請選擇下面代碼的輸出結果( )

int main(int argc, char* argv[])
{
int a = 10;
int b = 4;
int c = a/b;
int d = c * a * b++;

std::cout << d << std::endl;
return 0;

}
A 60
B 80
C 100
D 125

解釋:選B

程序首先將a和b分別賦值爲10和4,由於整數除法得到是捨去小數部分的整數,故c = a/b = 2,然後先計算d = cab = 2104 = 80,再執行b自增操作,即表達式執行完後b值爲5。題目的輸出是d的值,故運行程序後得到80。

4、Win32系統裏,下面幾個sizeof的運行結果是( )

int intValue = 1024;
char str[] = “Tencent” ;
const char* ch = str;
sizeof(intValue) = _a;
sizeof(str) = b;
sizeof(ch) = c;
A a=1, b=1, c=1
B a=4, b=4, c=4
C a=4, b=7, c=4
D a=4, b=8, c=4

解釋:選D

32位系統中,int型變量和char*型指針的大小都是4個字節,故a = 4,c = 4。在定義str時,”Tencent”需要7個字符的空間,並且字符串結尾要加上’\0’以示字符串的結束,即str一共佔8個字符的大小,故b = 8。

5、 以下是C++的不同數據類型值的比較語句,請問這些判斷語句中作爲條件部分的語句編寫有問題的有( )

A 如果變量bVar爲布爾類型:if (false = = bVar) { doSomeThing(); }
B 如果變量nVar爲int型:if (0 = = nVar) { doSomeThing(); }
C 如果變量fVar爲float型:if ( 0.02= = fVar) { doSomeThing(); }
D 如果變量sVar爲字符串型:if ( “” = = sVar) { doSomeThing(); }

解釋:選D

0.02無法用二進制精確表示。題中fVar爲float類型,而0.02作爲字面值,默認爲double類型,由於二者精度不同,對0.02的接近程度也不同,故該判斷條件永遠不會爲真。若將fVar改爲double型就沒有問題了。

6、 C語言裏i=5,j=7,請問i|j等於多少( )

A 1
B 3
C 5
D 7

解釋:選D

使用2進制可將5表示爲0101,將7表示爲0111,|爲按位或運算,故i|j = 0101|0111 = 0111 = 7。

7、 請閱讀如下C++代碼:

struct A
{
void foo(){printf ( “foo” );}
virtual void bar(){printf ( “bar” );}
A(){bar();}
};
struct B : A
{
void foo() {printf ( “b_foo” );}
void bar() {printf ( “b_bar” );}
};
如果執行如下語句:
A * p = new B;
p-> foo();
p-> bar();
那麼其輸出是( )
A b_bar foo b_bar
B bar foo b_bar
C b_bar foo bar
D b_bar b_foo b_bar
E bar b_foo bar

解釋:選B

B繼承自A,當new B時會依次調用A、B的無參構造函數,而A的無參構造函數中又調用成員函數bar(),此刻由於尚未構造繼承對象,所以bar()只會調用A的bar,從而最先輸出bar。執行p->foo()時,由於foo()不是虛函數,所以其調用由p指針類型決定,調用的是A的成員函數foo(),輸出foo;執行p-> bar()時,由於bar()是虛函數,且子類中有重寫,所以會調用B::bar(),輸出b_bar,故答案選B。
若將B中也添加一個構造函數。
struct B : A
{
void foo() {cout << “b_foo” ;}
void bar() {cout << “b_bar” ;}
B(){bar();}
};
則有:
bar b_bar foo b_bar

8、 有一個如下的結構體:

struct A
{
long a1;
short a2;
int a3;
int *a4;
}
請問在64位linux系統下用sizeof(struct A)計算出的大小是多少( )
A 24
B 28
C 16
D 18

解釋:選A

首先在64位linux系統中虛擬內存尋址空間是64位,即需要64位纔可以容納一個虛擬內存地址,所以該系統中int* 佔8位。其次在64位系統中,long佔8位,int依然佔4位,short佔2位,但是默認的對齊係數爲8字節。所以在不考慮內存對齊的情況下,sizeof(struct A)=8+2+4+8=22;考慮內存對齊時,需要進行如下兩步計算,
1)字節對齊
a1:long型,長度8=8 按8對齊;起始offset=0 0%4=0;存放區域[0,7]
a2:short型,長度2<8 按2對齊;起始offset=8 8%2=0;存放區域[8,9]
a3:int型,長度4<8 按4對齊;起始offset=10 10%4=2;添加2節字保證對齊,存放區域[12,15]
a4 :int* 型,長度8=8 按8對齊;起始offset=16 16%8=0;存放區域[16,23]
成員大小=24
2)整體對齊
整體對齊係數=min(max(long,short,int, int*),8)(其中的8表示對齊係數)
綜上,整體大小爲成員大小按整體對齊係數圓整,而24%8=0無需補充字節,所以sizeof(struct A)=24。

9、 派生類對象對其基類中的什麼成員是可訪問的( )

A 公有繼承的公有成員
B 私有繼承的公有成員
C 私有繼承的保護成員
D 保護繼承的保護成員

解釋:選A

基類成員在派生類的訪問屬性取決於繼承方式以及這些成員在基類中的訪問屬性。
(1)基類的私有成員無論何種繼承方式在派生類中均不可直接訪問。
(2)在公有繼承方式下,基類的保護和公有成員在派生類中均保持原訪問屬性。
(3)在保護繼承方式下,基類的保護和公有成員在派生類中的訪問屬性均爲保護屬性。
(4)在私有繼承方式下,基類的保護和公有成員在派生類中的訪問屬性均爲私有屬性。

10、開發c代碼時,經常見到如下類型的機構體定義:

typedef struct list_t
{
struct list_t *next;
struct list_t *prev;
char data[0];
}list_t;
最後一行char data[0];的作用是( )
A 方便管理內存緩衝區
B 減少內存碎片化
C 標識結構體結束
D 沒有作用

解釋:選A

在結構中,data是一個數組名,但該數組沒有元素。如果給這個結構體分配的內存大於這個結構體實際大小,後面多餘的部分就是這個data的內容,這種聲明方法可以實現C語言裏的數組擴展。值得一提的是,該技術實際上使用了數組下標溢出,屬於有風險的略顯過時的技術,現代編譯器往往給出warning甚至error,實踐中應避免使用。
sizeof(list_t) == 8
char data[3] = “ab”;
struct list_t *p = (struct list_t *)malloc(sizeof(struct list_t )+strlen(data))

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