1.下面代碼的輸出是什麼?
class A
{
public:
A() { }
~A() { cout<<"~A"<<endl; }
};
class B:public A
{
public:
B(A &a):_a(a)
{
}
~B()
{
cout<<"~B"<<endl;
}
private:
A _a;
};
int main(void)
{
A a; //很簡單,定義a的時候調用了一次構造函數
B b(a);
}
A.~B
B.~B ~A
C.~B ~A ~A
D.~B ~A ~A ~A
要想搞明白該問題,需要理解基類構造析構函數、子類構造析構函數和子類成員變量構造析構函數的調用順序。
對於構造函數:基類構造函數 > 子類成員變量構造函數 > 子類構造函數
對於析構函數:子類析構函數 > 子類成員變量析構函數 > 基類析構函數
可以看出構造函數的調用過程和析構函數的調用過程正好相反。
main函數中首先構造變量a,然後是b。在構造b時首先調用b的基類A的構造函數,然後調用b中成員變量_a的構造函數,最後調用b的構造函數。
main函數調用結束返回時,變量的釋放順序跟變量的構造順序正好相反。首先釋放變量b,然後是變量a。
在釋放變量b時,首先調用b的析構函數,然後析構變量b的成員_a,析構_a時調用_a的析構函數。再調用b的基類的析構函數。
然後是釋放變量a,調用a的析構函數。
本例子中應該將A的析構函數更改爲virtual的,防止使用多態機制時出現子類對象無法釋放的情況,本例子中沒有用到多態機制,不存在該問題。
最開始析構b,~B,這個是沒有爭議的。
接着是析構b的成員變量_a,所以是~A
接着是b的parent class(基類)的~A
最後纔是a的析構~A
選D
2.下面有關malloc和new,說法錯誤的是?
A.new 建立的是一個對象, malloc分配的是一塊內存.
B.new 初始化對象,調用對象的構造函數,對應的delete調用相應的析構函數,malloc僅僅分配內存,free僅僅回收內存
C.new和malloc都是保留字,不需要頭文件支持
D.new和malloc都可用於申請動態內存和釋放內存,new是一個操作符,malloc是是一個函數
new/delete都是要分兩步操作的:new分配內存,並且調用對象的構造函數初始化一個對象;delete調用相應的析構函數,然後釋放內存
malloc/free只是分配內存/回收內存, 所以A、B對;
malloc需要頭文件”stdlib.h”或者”malloc.h” C錯;
new/delete都是內建的操作符,而malloc是一個函數,其函數原型是:
void *malloc(unsigned int num_bytes);
所以選C
3.下面有關類的靜態成員和非靜態成員,說法錯誤的是?
靜態成員存在於內存,非靜態成員需要實例化纔會分配內存
非靜態成員可以直接訪問類中靜態的成員
靜態成員能訪問非靜態的成員
非靜態成員的生存期決定於該類的生存期,而靜態成員則不存在生存期的概念
答案:C
靜態成員屬於類的,非靜態成員屬於對象的
非靜態成員可以訪問靜態成員時因爲類必定優先於對象而存在
反過來,靜態成員不能訪問非靜態成員
4.在32位小端的機器上,如下代碼輸出是什麼:
char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08};
short *pshort = (short *)array;
int *pint = (int *)array;
int64 *pint64 = (int64 *)array;
printf("0x%x , 0x%x , 0x%x , 0x%x", *pshort , *(pshort+2) , *pint64 , *(pint+2));
A.0x201 , 0x403 , 0x807060504030201 , 0x0
B.0x201 , 0x605 , 0x807060504030201 , 0x0
C.0x201 , 0x605 , 0x4030201 , 0x8070605
D.0x102 , 0x506 , 0x102030405060708 , 0x0
小端機器的數據高位字節放在高地址,低位字節放在低地址。x86結構爲小端模式。
pshort佔用2個字節,在內存中的16進製爲0x01 0x02,對應的16進制數爲0x0201。
pshort + 2指向array數組的下標爲4的元素,佔用2個字節,在內存中的16進製爲0x05 0x06,對應的16進制數爲0x0605。
pint64的int64類型不確定,但根據名字可以看出佔用8個字節,對應的16進制形式爲0x807060504030201。
pint + 2佔用4個字節,指向的array數組的下標爲8的元素,8-11個元素沒有指定數組的初始化值,默認爲0,因此*(pint + 2)對應的16進製爲0。
選B
5.請問i的值是:
int main()
{
unsigned char i = 1;
i -= 4;
printf(“the value of i is: % d”, i);
}
A.253
B.254
C.255
D.256
unsigned char 總共8位,1-4 = -3,-3用8位二進制表示就是11111101(因爲向前擴展最高位是多少就填多少,這裏是1)因爲是無符號數,所以最高位的1不做符號位,作爲數值爲,11111101對應的十進制數爲253
6.下述程序的輸出是____。
#include<stdio.h>
int main()
{
static char *s[] = {"black", "white", "pink", "violet"};
char **ptr[] = {s+3, s+2, s+1, s}, ***p;
p = ptr;
++p;
printf("%s", **p+1);
return 0;
}
A.ink
B.pink
C.white
D.hite