c/c++面試題(7)零碎知識(shí)總結(jié)
1.變量的聲明和定義有什么區(qū)別?
聲明:變量的聲明做了兩件事情
a.告訴編譯器這個(gè)變量已經(jīng)匹配到一塊內(nèi)存上了,下面的代碼用到的變量或?qū)ο笫窃趧e處定義的.
聲明可以出現(xiàn)很多次.
b.告訴編譯器這個(gè)變量名已經(jīng)被我占用了,其他的的變量將不能再使用.
定義:告訴編譯器創(chuàng)建一個(gè)對(duì)象,為這個(gè)對(duì)象分配一塊內(nèi)存并給它取一個(gè)名字,這個(gè)名字就是常說(shuō)的
變量名或?qū)ο竺?同一變量或?qū)ο蟮亩x只能出現(xiàn)一次.
本質(zhì)區(qū)別:聲明沒(méi)有分配內(nèi)存,而定義則是創(chuàng)建了對(duì)象并為這個(gè)對(duì)象分配了一塊內(nèi)存.
2.sizeof和strlen之間的區(qū)別?
a.sizeof是一個(gè)操作符,而strlen是一個(gè)庫(kù)函數(shù),使用需要包含<string.h>頭文件.
b.sizeof的參數(shù)可以是數(shù)據(jù)類型或變量,而strlen函數(shù)只能以結(jié)尾為'\0'的字符串的作為參數(shù).
c.編譯器在編譯的時(shí)候就計(jì)算出了sizeof的結(jié)果.而strlen函數(shù)必須在運(yùn)行的時(shí)候才能計(jì)算出來(lái).
d.sizeof計(jì)算的是數(shù)據(jù)類型占用的內(nèi)存的大小,而strlen計(jì)算的字符串實(shí)際的長(zhǎng)度,不包括'\0';
注意strlen在計(jì)算字符數(shù)組的時(shí)候,遇到0的時(shí)候和遇到'\0'的效果一樣.
e.數(shù)組作為sizeof的參數(shù)不會(huì)退化,而作為strlen的參數(shù)的時(shí)候會(huì)退化為一個(gè)字符指針.
3.簡(jiǎn)要的說(shuō)下static的用途.C語(yǔ)言關(guān)鍵字static 和 C++的關(guān)鍵字static之間的區(qū)別?
a.在C語(yǔ)言中static可以修飾局部變量,全局變量和函數(shù).
static修飾的局部變量,改變了它的存儲(chǔ)方式,由原來(lái)的棧區(qū)改變成靜態(tài)區(qū).實(shí)際上就是影響了它的
生命周期,作用域并沒(méi)有改變.好處是具有繼承特性,每次調(diào)用時(shí)候都要?jiǎng)?chuàng)建的開(kāi)銷.
static修飾的全局變量,改變了它的聲明周期,但是存儲(chǔ)方式并沒(méi)有改變,普通的全局變量和靜態(tài)的
全局變量都是在靜態(tài)存儲(chǔ)區(qū)域,只是改變了它的作用域.由原來(lái)的在整個(gè)源程序都可以使用到只有
定義它的那個(gè)源文件使用.
static修飾的函數(shù)也是改變它的作用域,static修飾的函數(shù)又叫內(nèi)部函數(shù);只能在本模塊內(nèi)使用,
而不能被其他的模塊使用.
b.C++中除了上述的用途之外,static還可以定義類的成員變量和函數(shù).
static定義的成員變量和函函數(shù)是隸屬于類,而不是對(duì)象.所有的用類實(shí)例化的對(duì)象都共享
一份,訪問(wèn)static成員的時(shí)候有兩種方式:一是通過(guò)類域解析::一個(gè)是通過(guò)實(shí)例化的對(duì)象.
C++的靜態(tài)成員可以在多個(gè)對(duì)象間進(jìn)行通信,傳遞信息.
4.C中的malloc/free和C++中new/delete之間的區(qū)別?
a.maloc/free是C的標(biāo)準(zhǔn)庫(kù)函數(shù),可以覆蓋,但是不能重載,C和C++都可以使用.而new/delete是操作符,
可以重載,只能在C++中使用.
b.對(duì)于非內(nèi)部的數(shù)據(jù)類型的對(duì)象而言,光用malloc/free是無(wú)法滿足對(duì)象的要求的.對(duì)象在創(chuàng)建的時(shí)候需要
執(zhí)行構(gòu)造函數(shù),對(duì)象在消亡之前需要執(zhí)行析構(gòu)函數(shù).而malloc/free是庫(kù)函數(shù)而不是運(yùn)算符,不在編譯器
的控制范圍之內(nèi),編譯器不能將執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加給malloc/free.因此C++需要有一
個(gè)能夠完成動(dòng)態(tài)分配內(nèi)存和初始化的new,以及一個(gè)能夠完成清理和釋放內(nèi)存的運(yùn)算符delete.
c.new的返回值是指定類型的指針,可以自動(dòng)的計(jì)算所需要分配的內(nèi)存的大小.而malloc的返回值是一個(gè)
void類型的指針,使用的使用要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,并且分配的大小也要程序員的手動(dòng)進(jìn)行計(jì)算.
d.new/delete完全覆蓋了malloc/free的功能,只所以還保留malloc/free,是因?yàn)槲覀冊(cè)趯慍++程序的時(shí)候有
時(shí)會(huì)調(diào)用用C編寫的代碼,而C中又沒(méi)有new/delete操作符.
e.new的時(shí)候做兩件事情:內(nèi)存被分配,為被分配的內(nèi)存調(diào)用一個(gè)或多個(gè)構(gòu)造函數(shù)構(gòu)建對(duì)象.
delete的時(shí)候也是一樣:為將要被釋放的內(nèi)存調(diào)用一個(gè)或多個(gè)析構(gòu)函數(shù),釋放內(nèi)存.
4.寫一個(gè)標(biāo)準(zhǔn)的宏MIN,并說(shuō)明下一個(gè)宏的一些用的注意事項(xiàng)?
#define MIN(a,b) ((a) < (b) ? (a) :(b))
調(diào)用的時(shí)候要注意它的副作用,例如
((++*p)<=(x)?(++*p):(x))這種三目操作符最好不要用來(lái)比較帶有自增或自減的表達(dá)式,因?yàn)樵谶\(yùn)算的
過(guò)程式會(huì)多改變一次,就違背了原來(lái)的本意.
5.一個(gè)指針可以是volatile嗎?
可以.因?yàn)橹羔樅推胀ǖ淖兞恳粯右彩且粋€(gè)變量,有時(shí)也會(huì)有變化程序的不可控制性.常見(jiàn)的例子:
子中斷服務(wù)子程序修改一個(gè)指向一個(gè)buffer的指針時(shí),必須用volatile來(lái)修飾這個(gè)指針.
volatile修飾的指針通常是共享指針,通常是這個(gè)指針被多個(gè)服務(wù)共享的時(shí)候,這個(gè)時(shí)候就有可能
在編譯器的檢測(cè)能力之外改變它的值.
6.簡(jiǎn)述strcpy,sprintf,memcpy的區(qū)別?
char* strcpy(char* dest,const char* src);
int sprintf(char* str,cosnt char* format,...);
void* memcpy(void* dest,void* src,size_t n);
1.操作的對(duì)象不同,strcpy的兩個(gè)操作對(duì)象均為字符串,sprintf的操作源對(duì)象可以是多種數(shù)據(jù)類型,
目的操作對(duì)象是字符串,memcpy的兩個(gè)對(duì)象是兩個(gè)任意類型的可以操作的內(nèi)存地址,不限制
任何的類型.
2.執(zhí)行的效率不同,memcpy最高,strcpy次之,sprintf效率最低.
3.實(shí)現(xiàn)的功能不同,strcpy主要實(shí)現(xiàn)字符串變量間的拷貝,它不檢測(cè)邊界.sprintf主要實(shí)現(xiàn)其他數(shù)據(jù)格式
到字符串之間的轉(zhuǎn)換.memcpy主要是內(nèi)存塊間的拷貝.
7.設(shè)置地址為0x67a9的整型變量的值為0xaa66;
int* p = (int*)0x67a9;
*p = 0xaa66;
無(wú)論是什么平臺(tái)地址長(zhǎng)度和整型數(shù)據(jù)的長(zhǎng)度都是一樣的,即一個(gè)整型數(shù)據(jù)可以強(qiáng)制類型轉(zhuǎn)換成地址
指針類型的只要有意義即可.
8.C++中的重載,覆蓋,隱藏之間的區(qū)別?
a.重載(overload)的特征:函數(shù)名相同,同一作用域下參數(shù)列表不同的函數(shù)才形成重載.它對(duì)于返回類型
和是否是virtual函數(shù)沒(méi)有關(guān)系.重載的功能就是同一函數(shù)名具有不同的行為.
b.覆蓋(override)的特征:它指的是派生類的函數(shù)覆蓋基類的函數(shù),因此作用域不同.并且覆蓋的要求
函數(shù)名相同,參數(shù)列表相同并且返回類型都必須相同.基類的成員函數(shù)必須是虛函數(shù).
所謂的覆蓋指的是:用基類對(duì)象的指針或引用訪問(wèn)虛函數(shù)根據(jù)實(shí)際的指向來(lái)實(shí)際的決定所調(diào)用的函數(shù)
c.隱藏(hide)的特征:隱藏指的是派生類的函數(shù)隱藏(屏蔽)了與其同名的基類的函數(shù).在調(diào)用一個(gè)類成員函數(shù)的
時(shí)候,編譯器會(huì)沿著類的繼承鏈逐級(jí)的向上查找函數(shù)的定義,如果找到了,那么就停止查找了.所以如果一個(gè)
派生類和它的基類都有同一個(gè)同名的函數(shù),編譯器最終選擇派生類中的函數(shù),那么就說(shuō)派生類中的成員函數(shù)
隱藏了基類中的成員函數(shù),也就是說(shuō)它阻止了編譯器繼續(xù)向上查找的行為.
posted on 2014-07-13 16:01 亞三論 閱讀(650) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)