10-29C/C++刷題
1、函式呼叫exec((v1,v2),(v3,v4,v5),v6,v7)中,實參的個數是4個。
解析:逗號運算子(百度百科):在C語言中,多個表示式可以用逗號分開,其中用逗號分開的表示式的值分別結算,但整個表示式的值是最後一個表示式的值。
所以exec((v1,v2), (v3,v4,v5),v6,v7)相當於exec(v2, v5,v6,v7)。
宣告定義函式的時候,exec((v1,v2), (v3,v4,v5),v6,v7)括號內的引數叫做“形式引數”,不是實際的引數變數,是用來接收傳遞的引數的。而實際呼叫函式的時候,括號內應該填上對應型別的引數,也就是傳遞實際引數到函式內,這些引數就是“實參”。
題目問的是“呼叫”函式時,“實參”的數量,也就是4啦。
2、C語言程式中必須有的函式式main函式。main函式作為函式的入口必須存在。
3、在共有派生的情況下,派生類中定義的成員函式只能訪問原基類的共有成員和保護成員。
解析:使用 private 繼承 , 父類的所有方法在子類中變為 private;
使用 protected 繼承 , 父類的 protected 和 public 方法在子類中變為 protected,private 方法不變 ;
使用 public 繼承 , 父類中的方法屬性不發生改變 。
4、有以下結構體說明進入變數的定義,且指標p指向變數a,指標q指向變數b。則不能把結點b連線到結點a之後的語句是p.next=&b;
struct node
{
char data;
struct node *next;
}a,b,*p=&a,*q=&b;
解析:p是一指向結構體型別的指標變數,其初始值是讓其指向結構體變數a,要通過指標變數p來引用結構體變數的成員next,通常可使用兩種形式:p->next 或(*p).next,而p.next是非法的引用。
5、下面程式碼的執行結果
int a[]={1,2,3,4}; int *b=a; *b+=2; *(b+2)=2; b++; printf("%d,%d\n",*b,*(b+2));
解析:輸出2,4
陣列名a作為右值時代表陣列元素的首地址也就是&a[0],* b=a,此時b指向了第一個元素也就是1,然後 * b+=2,也就是1+2=3,此時陣列第一個元素變成了3.* (b+2)相當於a[2]也就是a[2]=2,此時陣列第三個元素變成了2. b++也就是b=b+1,此時b已經指向了陣列的第二個元素也就是2.因此 * (b+2)也就是變成了陣列的第四個元素也就是4。
6、下面程式的輸出是什麼
int main(void) { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); return 0;
解析:輸出2 5
&a就是陣列的地址,&a+1相當於加一個數組,即偏移一個數組。
注意理解兩個步長。 * (a+1)中的1為元素, (ptr-1)中的1為陣列。 (a+1)就是a[1],輸出為2,指標+1所得的結果要根據指標型別加上一定的值,不同型別的指標+1之後增加的大笑不停,a的長度為5的int陣列指標,所以要加5 * sizeof(int),所以第四行語句執行後,ptr指向a[5],最後輸出時,即*(ptr-1)時,ptr為int型指標,則-1操作減少sizeof(int * )指向a[4],輸出為5.
7、通過指標呼叫基類虛擬函式時,C++系統對該呼叫採用動態聯編。
靜態聯編 :指在編譯階段就將函式實現和函式呼叫關聯起來,也叫早繫結。
動態聯編:在程式執行的時候才將函式實現和函式呼叫關聯。因此也叫晚繫結,一般情況下都是靜態聯編,涉及到多型和虛擬函式就必須使用動態聯編了。
8、對於基類相同的兩個指標變數之間,不能進行的運算是+。
C語言中,對於基型別相同的兩個指標變數之間可以進行大小比較、賦值及減法運算,但加法運算沒有意義。
9、有函式定義:
void test(int a){}
void test (float a){}
則以下呼叫錯誤的是(D)
A test(1)
B test(‘c’)
C test(2+‘d’)
D test (0.5)
解析:編譯器會提示引數不匹配,但是不匹配的原因是:型別轉換隻能從下往上自動轉換,而不能自動從上往下轉換。
0.5預設是double型別,既不能轉換成float型別,也不能轉換成int型別。故會提示引數不匹配。
10、關於“深拷貝”,下列說法正確的是(A)
A 會拷貝動態分配的成員物件
B 會拷貝成員資料的值
C 會拷貝靜態分配的成員物件
D B和C都對
解析:深拷貝是指源物件與拷貝物件互相獨立,其中任何一個物件的改動都不會對另外一個物件造成影響。
淺拷貝是指源物件與拷貝物件共用一份實體,僅僅是引用的變數不同(名稱不同)。對其中任何一個物件的改動都會影響另外一個物件。
B和C都算錯在了一個地方,沒有考慮靜態成員。類的靜態成員是所有類的例項共有的,儲存在全域性(靜態)區,只此一份,不管繼承、例項化還是拷貝都是一份。
B中,靜態成員屬於成員資料,而C中,靜態成員和區域性成員都是靜態分配的(與動態分配對應),因此B和C中都包含了靜態成員,所以不正確。
因此,D也不正確。