1.有以下程序段
int * p;
p = ______malloc(sizeof(int));
若要求使p指向一個int型的動態(tài)存儲單元,在橫線處應(yīng)填入的是?
答:( int * )
解析:malloc返回一個void*類型的指針刃唐,需要強(qiáng)制轉(zhuǎn)化成int*類型的指針豌鹤,這樣才能表明指針的地址和指向內(nèi)存單元的大小陋桂。
2.以下程序
#include <stdio.h>
void fun( char ** p)
{
int i;
for(i=0;i<4;i + + )printf("% s",p[i]);
}
main( )
{
char *s[6]={ "ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX" };
fun(s);
printf("\n");
}
程序運(yùn)行后的輸出結(jié)果是?
答:ABCDEFGHIJKLMNOP
解析:以上語句定義了一個指針數(shù)組 s。首先這是一個數(shù)組柄瑰,這個數(shù)組里存儲的是指針茬射,也就是說s[1], s[2] ...等存儲的都是指針管引,類型是 char*闸迷。而數(shù)組名是指向第一個元素的常量指針嵌纲,因此 s 是指向指針的指針,所以函數(shù) fun 的形參定義是 char **腥沽。fun(s) 將指針 s 的值傳遞給形參 p逮走,所以 p = s。
3.有如下程序今阳,執(zhí)行后輸出的結(jié)果是( )
#include <iostream.h>
class cla{
static int n;
public:
cla(){n++;}
~cla(){n--;}
static int get_n(){return n;}
};
int cla::n= 0;
int main()
{
cla *p =new cla;
delete p;
cout<<"n="<<cla::get_n()<<endl;
return 0;
}
答:n=0
解析:類的實(shí)例化:cla *p = new cla言沐,p分配在棧上邓嘹,p指向的對象分配在堆上酣栈。n為靜態(tài)成員變量险胰,沒有this指針,屬于類域矿筝,所有對象共享起便。
實(shí)例化——調(diào)用構(gòu)造函數(shù),所以n++窖维;
delete——調(diào)用析構(gòu)函數(shù)榆综,所以n--。
最后輸仍舊為0铸史。
4.關(guān)于類與對象鼻疮,下面哪一種說法是錯誤的?
A.一個對象是某個類的一個實(shí)例
B.一個實(shí)例是某個類型經(jīng)實(shí)例化所產(chǎn)生的一個實(shí)體
C.創(chuàng)建一個對象必須指定被實(shí)例化的一個類
D.一個類的多個對象之間不僅持有獨(dú)立的數(shù)據(jù)成員琳轿,而且成員函數(shù)也是獨(dú)立的
答:D
解析:靜態(tài)成員變量判沟、靜態(tài)成員函數(shù)是由同一類中的所有對象共享的。
5.
#include<iostream>
using namespace std;
class A{
public:
void test()
{ printf("test A"); }
};
int main(){
A* pA = NULL;
pA->test();
return 0;
}
其實(shí)這個是可以正常運(yùn)行的
原因如下:
因為對于非虛成員函數(shù)崭篡,C++這門語言是靜態(tài)綁定的挪哄。這也是C++語言和其它語言Java, Python的一個顯著區(qū)別。以此下面的語句為例:
pA->test();
這語句的意圖是:調(diào)用對象 pA 的 test 成員函數(shù)琉闪。如果這句話在Java或Python等動態(tài)綁定的語言之中迹炼,編譯器生成的代碼大概是:
找到 pA 的 test 成員函數(shù),調(diào)用它颠毙。(注意斯入,這里的找到是程序運(yùn)行的時候才找的,這也是所謂動態(tài)綁定的含義:運(yùn)行時才綁定這個函數(shù)名與其對應(yīng)的實(shí)際代碼蛀蜜。有些地方也稱這種機(jī)制為遲綁定刻两,晚綁定。)
但是對于C++涵防。為了保證程序的運(yùn)行時效率闹伪,C++的設(shè)計者認(rèn)為凡是編譯時能確定的事情,就不要拖到運(yùn)行時再查找了壮池。所以C++的編譯器看到這句話會這么干:
1:查找 pA 的類型偏瓤,發(fā)現(xiàn)它有一個非虛的成員函數(shù)叫 test 。(編譯器干的)
2:找到了椰憋,在這里生成一個函數(shù)調(diào)用厅克,直接調(diào)A:: test ( pA )。
所以到了運(yùn)行時橙依,由于 test ()函數(shù)里面并沒有任何需要解引用 pA 指針的代碼证舟,所以真實(shí)情況下也不會引發(fā)segment fault硕旗。這里對成員函數(shù)的解析,和查找其對應(yīng)的代碼的工作都是在編譯階段完成而非運(yùn)行時完成的女责,這就是所謂的靜態(tài)綁定漆枚,也叫早綁定。
正確理解C++的靜態(tài)綁定可以理解一些特殊情況下C++的行為抵知。
5.C和Objective-C的混合使用墙基,以下描述錯誤的是()
選項:
A.cpp文件只能使用C/C++代碼
B.cpp文件include的頭文件中,可以出現(xiàn)objective-C的代碼
C.mm文件中混用cpp直接使用即可
D.cpp使用objective-C的關(guān)鍵是使用接口刷喜,而不能直接使用代碼
答:B
解析:obj-c 的編譯器處理后綴為 m 的文件時残制,可以識別 obj-c 和 c 的代碼,處理 mm 文件可以識別 obj-c,c,c++ 代碼掖疮,但 cpp 文件必須只能用 c/c++ 代碼初茶,而且 cpp 文件 include 的頭文件中,也不能出現(xiàn) obj-c 的代碼浊闪,因為 cpp 只是 cpp恼布。