C++常見(jiàn)基礎(chǔ)知識(shí)

1.在C++ 程序中調(diào)用被C 編譯器編譯后的函數(shù)颊艳,為什么要加extern “C”投队?

答:首先枫疆,extern是C/C++語(yǔ)言中表明函數(shù)和全局變量作用范圍的關(guān)鍵字,該關(guān)鍵字告訴編譯器敷鸦,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用息楔。

通常,在模塊的頭文件中對(duì)本模塊提供給其它模塊引用的函數(shù)和全局變量以關(guān)鍵字extern聲明扒披。extern "C"是連接申明(linkage declaration),被extern "C"修飾的變量和函數(shù)是按照C語(yǔ)言方式編譯和連接的钞螟。作為一種面向?qū)ο蟮恼Z(yǔ)言,C++支持函數(shù)重載谎碍,而過(guò)程式語(yǔ)言C則不支持鳞滨。函數(shù)被C++編譯后在符號(hào) 庫(kù)中的名字與C語(yǔ)言的不同。例如蟆淀,假設(shè)某個(gè)函數(shù)的原型為:void foo( int x, int y );該函數(shù)被C編譯器編譯后在符號(hào)庫(kù)中的名字為_(kāi)foo拯啦,而C++編譯器則會(huì)產(chǎn)生像_foo_int_int之類的名字。這樣的名字包含了函數(shù)名熔任、函數(shù)參 數(shù)數(shù)量及類型信息褒链,C++就是靠這種機(jī)制來(lái)實(shí)現(xiàn)函數(shù)重載的。

所以疑苔,可以用一句話概括extern “C”這個(gè)聲明的真實(shí)目的:解決名字匹配問(wèn)題甫匹,實(shí)現(xiàn)C++與C的混合編程

2.頭文件中的ifndef/define/endif有什么作用惦费?

答:這是C++預(yù)編譯頭文件保護(hù)符兵迅,保證即使文件被多次包含,頭文件也只定義一次薪贫。

3.?#include 與 #include "file.h"的區(qū)別恍箭?

答:前者是從標(biāo)準(zhǔn)庫(kù)路徑尋找和引用file.h,而后者是從當(dāng)前工作路徑搜尋并引用file.h瞧省。

4.評(píng)價(jià)一下C/C++各自的特點(diǎn)

答:C語(yǔ)言是一種結(jié)構(gòu)化語(yǔ)言扯夭,面向過(guò)程,基于算法和數(shù)據(jù)結(jié)構(gòu)鞍匾,所考慮的是如何通過(guò)一個(gè)過(guò)程或者函數(shù)從輸入得到輸出交洗;

C++是面向?qū)ο螅陬愊鹗纭?duì)象和繼承构拳,所考慮的是如何構(gòu)造一個(gè)對(duì)象模型,讓這個(gè)模型能夠契合與之對(duì)應(yīng)的問(wèn)題,通過(guò)獲取對(duì)象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過(guò)程控制隐圾。

5.const 有什么用途?

答:在C/C++中掰茶,(1)可以定義const常量暇藏,(2)修飾函數(shù)的返回值和形參;

在C++中濒蒋,還可以修飾函數(shù)的定義體盐碱,定義類的const成員函數(shù)。被const修飾的東西受到強(qiáng)制保護(hù)沪伙,可以預(yù)防意外的變動(dòng)瓮顽,提高了程序的健壯性。

6.const和#define有什么區(qū)別围橡?

答:(1)const和#define都可以定義常量暖混,但是const用途更廣。

(2)const 常量有數(shù)據(jù)類型翁授,而宏常量沒(méi)有數(shù)據(jù)類型拣播。編譯器可以對(duì)前者進(jìn)行類型安全檢查。而對(duì)后者只進(jìn)行字符替換收擦,沒(méi)有類型安全檢查贮配,并且在字符替換可能會(huì)產(chǎn)生意料不到的錯(cuò)誤。

(3) 有些集成化的調(diào)試工具可以對(duì)const 常量進(jìn)行調(diào)試塞赂,但是不能對(duì)宏常量進(jìn)行調(diào)試泪勒。

7.關(guān)于sizeof小結(jié)的。

答:sizeof計(jì)算的是在棧中分配的內(nèi)存大小宴猾。

(1) sizeof不計(jì)算static變量占得內(nèi)存圆存;

(2) 指針的大小一定是4個(gè)字節(jié),而不管是什么類型的指針仇哆;

(3) char型占1個(gè)字節(jié)辽剧,int占4個(gè)字節(jié),short int占2個(gè)字節(jié)

long int占4個(gè)字節(jié)税产,float占4字節(jié)怕轿,double占48字節(jié),string占4字節(jié)

一個(gè)空類占1個(gè)字節(jié)辟拷,單一繼承的空類占1個(gè)字節(jié)撞羽,虛繼承涉及到虛指針?biāo)哉?個(gè)字節(jié)

(4) 數(shù)組的長(zhǎng)度

若指定了數(shù)組長(zhǎng)度,則不看元素個(gè)數(shù)衫冻,總字節(jié)數(shù)=數(shù)組長(zhǎng)度*sizeof(元素類型)

若沒(méi)有指定長(zhǎng)度诀紊,則按實(shí)際元素個(gè)數(shù)類確定

Ps:若是字符數(shù)組,則應(yīng)考慮末尾的空字符隅俘。

(5) 結(jié)構(gòu)體對(duì)象的長(zhǎng)度

在默認(rèn)情況下邻奠,為方便對(duì)結(jié)構(gòu)體內(nèi)元素的訪問(wèn)和管理笤喳,當(dāng)結(jié)構(gòu)體內(nèi)元素長(zhǎng)度小于處理器位數(shù)的時(shí)候,便以結(jié)構(gòu)體內(nèi)最長(zhǎng)的數(shù)據(jù)元素的長(zhǎng)度為對(duì)齊單位碌宴,即為其整數(shù)倍杀狡。若結(jié)構(gòu)體內(nèi)元素長(zhǎng)度大于處理器位數(shù)則以處理器位數(shù)為單位對(duì)齊。

(6) unsigned影響的只是最高位的意義贰镣,數(shù)據(jù)長(zhǎng)度不會(huì)改變呜象,所以sizeof(unsigned int)=4

(7) 自定義類型的sizeof取值等于它的類型原型取sizeof

(8) 對(duì)函數(shù)使用sizeof,在編譯階段會(huì)被函數(shù)的返回值的類型代替

(9) sizeof后如果是類型名則必須加括號(hào)碑隆,如果是變量名可以不加括號(hào)恭陡,這是因?yàn)閟izeof是運(yùn)算符

(10) 當(dāng)使用結(jié)構(gòu)類型或者變量時(shí),sizeof返回實(shí)際的大小上煤。當(dāng)使用靜態(tài)數(shù)組時(shí)返回?cái)?shù)組的全部大小休玩,sizeof不能返回動(dòng)態(tài)數(shù)組或者外部數(shù)組的尺寸

8.sizeof與strlen的區(qū)別?

答: (1)sizeof的返回值類型為size_t(unsigned int)劫狠;

(2)sizeof是運(yùn)算符漂问,而strlen是函數(shù)此叠;

(3)sizeof可以用類型做參數(shù),其參數(shù)可以是任意類型的或者是變量、函數(shù)勿侯,而strlen只能用char*做參數(shù)雏赦,且必須是以’\0’結(jié)尾抬闯;

(4)數(shù)組作sizeof的參數(shù)時(shí)不會(huì)退化為指針浑塞,而傳遞給strlen是就退化為指針;

(5)sizeof是編譯時(shí)的常量孕惜,而strlen要到運(yùn)行時(shí)才會(huì)計(jì)算出來(lái)愧薛,且是字符串中字符的個(gè)數(shù)而不是內(nèi)存大小衫画;

9.指針和引用的區(qū)別毫炉?

答:指針和引用都提供了間接操作對(duì)象的功能。

(1) 指針定義時(shí)可以不初始化削罩,而引用在定義時(shí)就要初始化瞄勾,和一個(gè)對(duì)象綁定,而且一經(jīng)綁定弥激,只要引用存在进陡,就會(huì)一直保持和該對(duì)象的綁定;

(2) 賦值行為的差異:指針賦值是將指針重新指向另外一個(gè)對(duì)象微服,而引用賦值則是修改對(duì)象本身趾疚;

(3) 指針之間存在類型轉(zhuǎn)換,而引用分const引用和非const應(yīng)用,非const引用只能和同類型的對(duì)象綁定糙麦,const引用可以綁定到不同但相關(guān)類型的對(duì)象或者右值

10.?dāng)?shù)組和指針的區(qū)別辛孵?

答:(1)數(shù)組要么在全局?jǐn)?shù)據(jù)區(qū)被創(chuàng)建,要么在棧上被創(chuàng)建赡磅;指針可以隨時(shí)指向任意類型的內(nèi)存塊魄缚;

(2)修改內(nèi)容上的差別:

char a[] = “hello”;

a[0] = ‘X’;

char *p = “world”; // 注意p 指向常量字符串

p[0] = ‘X’; // 編譯器不能發(fā)現(xiàn)該錯(cuò)誤,運(yùn)行時(shí)錯(cuò)誤

(3)用運(yùn)算符sizeof 可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))仆邓。sizeof(p),p 為指針得到的是一個(gè)指針變量的字節(jié)數(shù),而不是p 所指的內(nèi)存容量伴鳖。C++/C 語(yǔ)言沒(méi)有辦法知道指針?biāo)傅膬?nèi)存容量节值,除非在申請(qǐng)內(nèi)存時(shí)記住它。注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí)榜聂,該數(shù)組自動(dòng)退化為同類型的指針搞疗。

11.空指針和懸垂指針的區(qū)別?

答:空指針是指被賦值為NULL的指針须肆;delete指向動(dòng)態(tài)分配對(duì)象的指針將會(huì)產(chǎn)生懸垂指針匿乃。

(1) 空指針可以被多次delete,而懸垂指針再次刪除時(shí)程序會(huì)變得非常不穩(wěn)定豌汇;

(2) 使用空指針和懸垂指針都是非法的幢炸,而且有可能造成程序崩潰,如果指針是空指針拒贱,盡管同樣是崩潰宛徊,但和懸垂指針相比是一種可預(yù)料的崩潰。

12.C++中有malloc/free逻澳,為什么還有new/delete闸天?

答:malloc/free是C/C++標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete是C++運(yùn)算符斜做。他們都可以用于動(dòng)態(tài)申請(qǐng)和釋放內(nèi)存苞氮。

對(duì)于內(nèi)置類型數(shù)據(jù)而言,二者沒(méi)有多大區(qū)別瓤逼。malloc申請(qǐng)內(nèi)存的時(shí)候要制定分配內(nèi)存的字節(jié)數(shù)笼吟,而且不會(huì)做初始化;new申請(qǐng)的時(shí)候有默認(rèn)的初始化霸旗,同時(shí)可以指定初始化赞厕;

對(duì)于類類型的對(duì)象而言,用malloc/free無(wú)法滿足要求的定硝。對(duì)象在創(chuàng)建的時(shí)候要自動(dòng)執(zhí)行構(gòu)造函數(shù)皿桑,消亡之前要調(diào)用析構(gòu)函數(shù)。由于malloc /free是庫(kù)函數(shù)而不是運(yùn)算符,不在編譯器控制之內(nèi)诲侮,不能把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加給它镀虐,因此,C++還需要new/delete沟绪。

13.什么是智能指針刮便?

答:當(dāng)類中有指針成員時(shí),一般有兩種方式來(lái)管理指針成員:一是采用值型的方式管理绽慈,每個(gè)類對(duì)象都保留一份指針指向的對(duì)象的拷貝恨旱;另一種更優(yōu)雅的方式是使用智能指針,從而實(shí)現(xiàn)指針指向的對(duì)象的共享坝疼。

智能指針的一種通用實(shí)現(xiàn)技術(shù)是使用引用計(jì)數(shù)搜贤。智能指針類將一個(gè)計(jì)數(shù)器與類指向的對(duì)象相關(guān)聯(lián),引用計(jì)數(shù)跟蹤該類有多少個(gè)對(duì)象共享同一指針钝凶。

每次創(chuàng)建類的新對(duì)象時(shí)仪芒,初始化指針并將引用計(jì)數(shù)置為1;當(dāng)對(duì)象作為另一對(duì)象的副本而創(chuàng)建時(shí)耕陷,拷貝構(gòu)造函數(shù)拷貝指針并增加與之相應(yīng)的引用計(jì)數(shù)掂名;對(duì)一個(gè)對(duì) 象進(jìn)行賦值時(shí),賦值操作符減少左操作數(shù)所指對(duì)象的引用計(jì)數(shù)(如果引用計(jì)數(shù)為減至0哟沫,則刪除對(duì)象)饺蔑,并增加右操作數(shù)所指對(duì)象的引用計(jì)數(shù);調(diào)用析構(gòu)函數(shù)時(shí)嗜诀,構(gòu) 造函數(shù)減少引用計(jì)數(shù)(如果引用計(jì)數(shù)減至0膀钠,則刪除基礎(chǔ)對(duì)象)。

14.面向?qū)ο蠹夹g(shù)的基本概念是什么裹虫,三個(gè)基本特征是什么肿嘲?

答:基本概念:類、對(duì)象筑公、繼承雳窟; 基本特征:封裝、繼承匣屡、多態(tài)封救。

封裝:將低層次的元素組合起來(lái)形成新的、更高實(shí)體的技術(shù)捣作;

繼承:廣義的繼承有三種實(shí)現(xiàn)形式:實(shí)現(xiàn)繼承誉结、可視繼承、接口繼承券躁。

多態(tài):允許將子類類型的指針賦值給父類類型的指針

15.C++空類默認(rèn)有哪些成員函數(shù)惩坑?

答:默認(rèn)構(gòu)造函數(shù)掉盅、析構(gòu)函數(shù)、復(fù)制構(gòu)造函數(shù)以舒、賦值函數(shù)

16.哪一種成員變量可以在一個(gè)類的實(shí)例之間共享趾痘?

答:static靜態(tài)成員變量

17.繼承層次中,為什么基類析構(gòu)函數(shù)是虛函數(shù)蔓钟?

答:編譯器總是根據(jù)類型來(lái)調(diào)用類成員函數(shù)永票。但是一個(gè)派生類的指針可以安全地轉(zhuǎn)化為一個(gè)基類的指針。這樣刪除一個(gè)基類的指針的時(shí)候滥沫,C++不管這個(gè)指針指向 一個(gè)基類對(duì)象還是一個(gè)派生類的對(duì)象侣集,調(diào)用的都是基類的析構(gòu)函數(shù)而不是派生類的。如果你依賴于派生類的析構(gòu)函數(shù)的代碼來(lái)釋放資源兰绣,而沒(méi)有重載析構(gòu)函數(shù)世分,那么 會(huì)有資源泄漏。

18.為什么構(gòu)造函數(shù)不能為虛函數(shù)狭魂?

答:虛函數(shù)采用一種虛調(diào)用的方法罚攀。需調(diào)用是一種可以在只有部分信息的情況下工作的機(jī)制党觅。如果創(chuàng)建一個(gè)對(duì)象雌澄,則需要知道對(duì)象的準(zhǔn)確類型,因此構(gòu)造函數(shù)不能為虛函數(shù)杯瞻。

19.如果虛函數(shù)是有效的镐牺,那為什么不把所有函數(shù)設(shè)為虛函數(shù)?

答:不行魁莉。首先睬涧,虛函數(shù)是有代價(jià)的,由于每個(gè)虛函數(shù)的對(duì)象都要維護(hù)一個(gè)虛函數(shù)表旗唁,因此在使用虛函數(shù)的時(shí)候都會(huì)產(chǎn)生一定的系統(tǒng)開(kāi)銷畦浓,這是沒(méi)有必要的。

20.構(gòu)造函數(shù)可以是內(nèi)聯(lián)函數(shù)

21.什么是多態(tài)检疫?多態(tài)有什么作用讶请?

答:多態(tài)就是將基類類型的指針或者引用指向派生類型的對(duì)象。多態(tài)通過(guò)虛函數(shù)機(jī)制實(shí)現(xiàn)屎媳。

多態(tài)的作用是接口重用夺溢。

22.重載和覆蓋有什么區(qū)別?

答:虛函數(shù)是基類希望派生類重新定義的函數(shù)烛谊,派生類重新定義基類虛函數(shù)的做法叫做覆蓋风响;

重載就在允許在相同作用域中存在多個(gè)同名的函數(shù),這些函數(shù)的參數(shù)表不同丹禀。重載的概念不屬于面向?qū)ο缶幊套辞冢幾g器根據(jù)函數(shù)不同的形參表對(duì)同名函數(shù)的名稱做修飾鞋怀,然后這些同名函數(shù)就成了不同的函數(shù)。

重載的確定是在編譯時(shí)確定荧降,是靜態(tài)的接箫;虛函數(shù)則是在運(yùn)行時(shí)動(dòng)態(tài)確定。

23.公有繼承朵诫、受保護(hù)繼承辛友、私有繼承

答:(1)公有繼承時(shí),派生類對(duì)象可以訪問(wèn)基類中的公有成員剪返,派生類的成員函數(shù)可以訪問(wèn)基類中的公有和受保護(hù)成員废累;

(2)私有繼承時(shí),基類的成員只能被直接派生類的成員訪問(wèn)脱盲,無(wú)法再往下繼承邑滨;

(3)受保護(hù)繼承時(shí),基類的成員也只被直接派生類的成員訪問(wèn)钱反,無(wú)法再往下繼承掖看。

24.公有繼承時(shí)基類受保護(hù)的成員,可以通過(guò)派生類對(duì)象訪問(wèn)但不能修改面哥。

25.有哪幾種情況只能用構(gòu)造函數(shù)初始化列表而不能用賦值初始化哎壳?

答:const成員,引用成員

26.什么是虛指針尚卫?

答:虛指針或虛函數(shù)指針是虛函數(shù)的實(shí)現(xiàn)細(xì)節(jié)归榕。帶有虛函數(shù)的每一個(gè)對(duì)象都有一個(gè)虛指針指向該類的虛函數(shù)表。

27.C++如何阻止一個(gè)類被實(shí)例化吱涉?一般在什么時(shí)候?qū)?gòu)造函數(shù)聲明為private刹泄?

答:(1)將類定義為抽象基類或者將構(gòu)造函數(shù)聲明為private;

(2)不允許類外部創(chuàng)建類對(duì)象怎爵,只能在類內(nèi)部創(chuàng)建對(duì)象

28.main函數(shù)執(zhí)行之前會(huì)執(zhí)行什么特石?執(zhí)行之后還能執(zhí)行代碼嗎?

答:(1)全局對(duì)象的構(gòu)造函數(shù)會(huì)在main函數(shù)之前執(zhí)行鳖链;

(2)可以姆蘸,可以用_onexit 注冊(cè)一個(gè)函數(shù),它會(huì)在main 之后執(zhí)行;

如果你需要加入一段在main退出后執(zhí)行的代碼撒轮,可以使用atexit()函數(shù)乞旦,注冊(cè)一個(gè)函數(shù)。

語(yǔ)法:

#include

#include

int atexit(void (*function")(void));

void fn1( void ), fn2( void ), fn3( void );

int main( void )

{

atexit(fn1);

atexit( fn2 );

printf( "This is executed first.\n" );

}

void fn1()

{

printf( " This is\n" );

}

void fn2()

{

printf( " executed next." );

}

結(jié)果:

This is executed first.

This is executed next.

29.請(qǐng)描述進(jìn)程和線程的區(qū)別题山?

答:(1)進(jìn)程是程序的一次執(zhí)行兰粉,線程是進(jìn)程中的執(zhí)行單元;

(2)進(jìn)程間是獨(dú)立的顶瞳,這表現(xiàn)在內(nèi)存空間玖姑、上下文環(huán)境上愕秫,線程運(yùn)行在進(jìn)程中;

(3)一般來(lái)講焰络,進(jìn)程無(wú)法突破進(jìn)程邊界存取其他進(jìn)程內(nèi)的存儲(chǔ)空間戴甩;而同一進(jìn)程所產(chǎn)生的線程共享內(nèi)存空間;

(4)同一進(jìn)程中的兩段代碼不能同時(shí)執(zhí)行闪彼,除非引入多線程甜孤。

30.進(jìn)程間如何通信?

答:信號(hào)畏腕、信號(hào)量缴川、消息隊(duì)列、共享內(nèi)存

31.在網(wǎng)絡(luò)編程中涉及并發(fā)服務(wù)器描馅,使用多進(jìn)程與多線程的區(qū)別把夸?

答:(1)線程執(zhí)行開(kāi)銷小,但不利于資源管理和保護(hù)铭污;進(jìn)程則相反恋日,進(jìn)程可跨越機(jī)器遷移。

(2)多進(jìn)程時(shí)每個(gè)進(jìn)程都有自己的內(nèi)存空間嘹狞,而多線程間共享內(nèi)存空間岂膳;

(3)線程產(chǎn)生的速度快,線程間通信快刁绒、切換快闷营;

(4)線程的資源利用率比較好烤黍;

(5)線程使用公共變量或者資源時(shí)需要同步機(jī)制知市。

32.說(shuō)一下TCP 3次握手、4次揮手的全過(guò)程速蕊。

33.TCP和UDP有什么區(qū)別嫂丙。

答:

TCP——傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務(wù)规哲。

當(dāng)客戶和服務(wù)器彼此交換數(shù)據(jù)前跟啤,必須先在雙方之間建立一個(gè)TCP連接,之后才能傳輸數(shù)據(jù)唉锌。TCP提供超時(shí)重發(fā)隅肥,丟棄重復(fù)數(shù)據(jù),檢驗(yàn)數(shù)據(jù)袄简,流量控制等功能腥放,保證數(shù)據(jù)能從一端傳到另一端。

UDP——用戶數(shù)據(jù)報(bào)協(xié)議绿语,是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的傳輸層協(xié)議秃症。UDP不提供可靠性候址,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們 能到達(dá)目的地种柑。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立一個(gè)連接岗仑,且沒(méi)有超時(shí)重發(fā)等機(jī)制,故而傳輸速度很快.

TCP協(xié)議和UDP協(xié)議的一些特性區(qū)別如下:

1.TCP協(xié)議在傳送數(shù)據(jù)段的時(shí)候要給段標(biāo)號(hào)聚请;UDP 協(xié)議不需要荠雕。

2.TCP協(xié)議可靠;UDP協(xié)議不可靠驶赏。

3.TCP協(xié)議是面向連接舞虱;UDP協(xié)議采用無(wú)連接。

4.TCP協(xié)議負(fù)載較高,采用虛電路母市;UDP協(xié)議低負(fù)載矾兜。

5.TCP協(xié)議的發(fā)送方要確認(rèn)接受方是否收到數(shù)據(jù)段(3次握手協(xié)議)。

6.TCP協(xié)議采用窗口技術(shù)和流控制患久。

34.如何編寫(xiě)套接字椅寺?

35.調(diào)用函數(shù)時(shí)要進(jìn)行參數(shù)壓棧,一般情況下順序是從最右邊參數(shù)往左壓棧蒋失。

36.經(jīng)常要操作的內(nèi)存分為那幾個(gè)類別返帕?

答:(1)棧區(qū):由編譯器自動(dòng)分配和釋放,存放函數(shù)的參數(shù)值篙挽、局部變量的值等荆萤;

(2)堆:一般由程序員分配和釋放,存放動(dòng)態(tài)分配的變量铣卡;(new/delete链韭;malloc/free)

(3)全局區(qū)(靜態(tài)區(qū)):全局變量和靜態(tài)變量存放在這一塊,初始化的和未初始化的分開(kāi)放煮落;

(4)文字常量區(qū):常量字符串就放在這里敞峭,程序結(jié)束自動(dòng)釋放;

(5)程序代碼區(qū):參訪函數(shù)體的二進(jìn)制代碼蝉仇。

37.請(qǐng)講述堆和棧的區(qū)別旋讹。

答:(1)申請(qǐng)方式不同。棧上有系統(tǒng)自動(dòng)分配和釋放轿衔;堆上有程序員自己申請(qǐng)并指明大谐良!;

(2)棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)害驹,大小很有限鞭呕;堆是向高地址擴(kuò)展,是不連續(xù)的內(nèi)存區(qū)域裙秋,空間相對(duì)大且靈活琅拌;

(3)棧由系統(tǒng)分配和釋放速度快缨伊;堆由程序員控制,一般較慢进宝,且容易產(chǎn)生碎片刻坊;

38.全局變量放在數(shù)據(jù)段,內(nèi)部變量static int count党晋;放在數(shù)據(jù)段谭胚,內(nèi)部變量char *p=“AAA”,p的位置在堆棧上未玻,指向的空間的位置數(shù)據(jù)段灾而,內(nèi)部變量char *p=new char;p的位置堆扳剿,指向的空間的位置數(shù)據(jù)段

39.字符數(shù)組與字符串的比較:最明顯的區(qū)別是字符串會(huì)在末尾自動(dòng)添加空字符旁趟。

41.類使用static成員的優(yōu)點(diǎn),如何訪問(wèn)庇绽?

答:優(yōu)點(diǎn):

(1)static 成員的名字是在類的作用域中锡搜,因此可以避免與其他類的成員或全局對(duì)象名字沖突;

(2)可以實(shí)施封裝瞧掺。static 成員可以是私有成員耕餐,而全局對(duì)象不可以;

(3) static 成員是與特定類關(guān)聯(lián)的辟狈,可清晰地顯示程序員的意圖肠缔。

static 數(shù)據(jù)成員必須在類定義體的外部定義(正好一次),static 關(guān)鍵字只能用于類定義體內(nèi)部的聲明中哼转,定義不能標(biāo)示為static. 不像普通數(shù)據(jù)成員明未,static成員不是通過(guò)類構(gòu)造函數(shù)進(jìn)行初始化,也不能在類的聲明中初始化释簿,而是應(yīng)該在定義時(shí)進(jìn)行初始化.保證對(duì)象正好定義一次的最好 辦法亚隅,就是將static 數(shù)據(jù)成員的定義放在包含類非內(nèi)聯(lián)成員函數(shù)定義的文件中硼莽。

靜態(tài)數(shù)據(jù)成員初始化的格式為:

<數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>

類的靜態(tài)數(shù)據(jù)成員有兩種訪問(wèn)形式:

<類對(duì)象名>.<靜態(tài)數(shù)據(jù)成員名> 或 <類類型名>::<靜態(tài)數(shù)據(jù)成員名>

42. static數(shù)據(jù)成員和static成員函數(shù)

答:(1)static數(shù)據(jù)成員:

static數(shù)據(jù)成員獨(dú)立于該類的任意對(duì)象而存在庶溶;每個(gè)static數(shù)據(jù)成員是與類關(guān)聯(lián)的對(duì)象,并不與該類的對(duì)象相關(guān)聯(lián)懂鸵。Static數(shù)據(jù)成員 (const static數(shù)據(jù)成員除外)必須在類定義體的外部定義偏螺。不像普通數(shù)據(jù)成員,static成員不是通過(guò)類的構(gòu)造函數(shù)進(jìn)行初始化匆光,而是應(yīng)該在定義時(shí)進(jìn)行初始 化套像。

(2)static成員函數(shù):

Static成員函數(shù)沒(méi)有this形參,它可以直接訪問(wèn)所屬類的static成員终息,不能直接使用非static成員夺巩。因?yàn)閟tatic成員不是任何對(duì)象的組成部分贞让,所以static成員不能被聲明為const。同時(shí)柳譬,static成員函數(shù)也不能被聲明為虛函數(shù)喳张。

43.static成員變量定義放在cpp文件中,不能放在初始化列表中美澳。Const static成員可就地初始化销部。

44.如何引用一個(gè)已經(jīng)定義過(guò)的全局變量?

答:可以用引用頭文件的方式制跟,也可以用extern關(guān)鍵字舅桩,如果用引用頭文件方式來(lái)引用某個(gè)在頭文件中聲明的全局變量,假定你將那個(gè)變量寫(xiě)錯(cuò)了雨膨,那么在編譯期間會(huì)報(bào)錯(cuò)擂涛,如果你用extern方式引用時(shí),假定你犯了同樣的錯(cuò)誤聊记,那么在編譯期間不會(huì)報(bào)錯(cuò)歼指,而在連接期間報(bào)錯(cuò)。

44.static關(guān)鍵字的作用甥雕。

答:static總是使得變量或?qū)ο蟮拇鎯?chǔ)形式變成靜態(tài)存儲(chǔ)踩身,連接方式變成內(nèi)部連接,對(duì)于局部變量(已經(jīng)是內(nèi)部連接了)社露,它僅改變其存儲(chǔ)方式挟阻;對(duì)于全局變量(已經(jīng)是靜態(tài)存儲(chǔ)了),它僅改變其連接類型峭弟。

47.多態(tài)類中的虛函數(shù)表是 Compile-Time附鸽,還是 Run-Time時(shí)建立的?

答案:虛擬函數(shù)表是在編譯期就建立了,各個(gè)虛擬函數(shù)這時(shí)被組織成了一個(gè)虛擬函數(shù)的入口地址的數(shù)組。而對(duì)象的隱藏成員--虛擬函數(shù)表指針是在運(yùn)行期--也就是構(gòu)造函數(shù)被調(diào)用時(shí)進(jìn)行初始化的瞒瘸,這是實(shí)現(xiàn)多態(tài)的關(guān)鍵坷备。

48.?一個(gè)父類寫(xiě)了一個(gè) virtual?函數(shù),如果子類覆蓋它的函數(shù)不加 virtual ,也能實(shí)現(xiàn)多態(tài)?

在子類的空間里情臭,有沒(méi)有父類的這個(gè)函數(shù)省撑,或者父類的私有變量? (華為筆試題)

答案:只要基類在定義成員函數(shù)時(shí)已經(jīng)聲明了 virtue關(guān)鍵字,在派生類實(shí)現(xiàn)的時(shí)候覆蓋該函數(shù)時(shí)俯在,virtue關(guān)鍵字可加可不加竟秫,不影響多態(tài)的實(shí)現(xiàn)。子類的空間里有父類的所有變量(static除外)跷乐。

49. 完成字符串拷貝可以使用 sprintf肥败、strcpy 及 memcpy 函數(shù),請(qǐng)問(wèn)這些函數(shù)有什么區(qū)別

,你喜歡使用哪個(gè)馒稍,為什么皿哨?

答案:這些函數(shù)的區(qū)別在于 實(shí)現(xiàn)功能以及操作對(duì)象不同。

(1)strcpy 函數(shù)操作的對(duì)象是字符串纽谒,完成從源字符串到目的字符串的拷貝功能往史。

(2)sprintf 函數(shù)操作的對(duì)象不限于字符串:雖然目的對(duì)象是字符串,但是源對(duì)象可以是字符串佛舱、也可以是任意基本類型的數(shù)據(jù)椎例。這個(gè)函數(shù)主要用來(lái)實(shí)現(xiàn)(字符串或基本數(shù)據(jù)類型)向字符串的轉(zhuǎn)換功能。如果源對(duì)象是字符串请祖,并且指定 %s 格式符订歪,也可實(shí)現(xiàn)字符串拷貝功能。

(3)memcpy 函數(shù)顧名思義就是內(nèi)存拷貝肆捕,實(shí)現(xiàn)將一個(gè)內(nèi)存塊的內(nèi)容復(fù)制到另一個(gè)內(nèi)存塊這一功能刷晋。內(nèi)存塊由其首地址以及長(zhǎng)度確定。程序中出現(xiàn)的實(shí)體對(duì)象慎陵,不論是什么類型眼虱, 其最終表現(xiàn)就是在內(nèi)存中占據(jù)一席之地(一個(gè)內(nèi)存區(qū)間或塊)。因此席纽,memcpy 的操作對(duì)象不局限于某一類數(shù)據(jù)類型捏悬,或者說(shuō)可適用于任意數(shù)據(jù)類型,只要能給出對(duì)象的起始地址和內(nèi)存長(zhǎng)度信息润梯、并且對(duì)象具有可操作性即可过牙。鑒于memcpy 函數(shù)等長(zhǎng)拷貝的特點(diǎn)以及數(shù)據(jù)類型代表的物理意義,memcpy 函數(shù)通常限于同種類型數(shù)據(jù)或?qū)ο笾g的拷貝纺铭,其中當(dāng)然也包括字符串拷貝以及基本數(shù)據(jù)類型的拷貝寇钉。

對(duì)于字符串拷貝來(lái)說(shuō),用上述三個(gè)函數(shù)都可以實(shí)現(xiàn)舶赔,但是其實(shí)現(xiàn)的效率和使用的方便程度不同:

? strcpy 無(wú)疑是最合適的選擇:效率高且調(diào)用方便扫倡。

? sprintf 要額外指定格式符并且進(jìn)行格式轉(zhuǎn)化,麻煩且效率不高竟纳。

? memcpy 雖然高效撵溃,但是需要額外提供拷貝的內(nèi)存長(zhǎng)度這一參數(shù),易錯(cuò)且使用不便蚁袭;并且如果長(zhǎng)度指定過(guò)大的話(最優(yōu)長(zhǎng)度是源字符串長(zhǎng)度 + 1)征懈,還會(huì)帶來(lái)性能的下降。其實(shí) strcpy 函數(shù)一般是在內(nèi)部調(diào)用 memcpy 函數(shù)或者用匯編直接實(shí)現(xiàn)的揩悄,以達(dá)到高效的目的。因此鬼悠,使用 memcpy 和 strcpy 拷貝字符串在性能上應(yīng)該沒(méi)有什么大的差別删性。

對(duì)于非字符串類型的數(shù)據(jù)的復(fù)制來(lái)說(shuō)亏娜,strcpy 和 snprintf 一般就無(wú)能為力了,可是對(duì) memcpy 卻沒(méi)有什么影響蹬挺。但是维贺,對(duì)于基本數(shù)據(jù)類型來(lái)說(shuō),盡管可以用 memcpy 進(jìn)行拷貝巴帮,由于有賦值運(yùn)算符可以方便且高效地進(jìn)行同種或兼容類型的數(shù)據(jù)之間的拷貝溯泣,所以這種情況下 memcpy 幾乎不被使用 。memcpy 的長(zhǎng)處是用來(lái)實(shí)現(xiàn)(通常是內(nèi)部實(shí)現(xiàn)居多)對(duì)結(jié)構(gòu)或者數(shù)組的拷貝榕茧,其目的是或者高效垃沦,或者使用方便,甚或兩者兼有用押。

50. 應(yīng)用程序在運(yùn)行時(shí)的內(nèi)存包括代碼區(qū)和數(shù)據(jù)區(qū)肢簿,其中數(shù)據(jù)區(qū)又包括哪些部分?

答:對(duì)于一個(gè)進(jìn)程的內(nèi)存空間而言蜻拨,可以在邏輯上分成 3個(gè)部份:代碼區(qū)池充,靜態(tài)數(shù)據(jù)區(qū)和動(dòng)態(tài)數(shù)據(jù)區(qū)。

動(dòng)態(tài)數(shù)據(jù)區(qū)一般就是“堆椂兴希”收夸。 棧是一種線性結(jié)構(gòu),堆是一種鏈?zhǔn)浇Y(jié)構(gòu)。進(jìn)程的每個(gè)線程都有私有的“椡妫”卦羡。

全局變量和靜態(tài)變量分配在靜態(tài)數(shù)據(jù)區(qū),本地變量分配在動(dòng)態(tài)數(shù)據(jù)區(qū)序苏,即堆棧中。程序通過(guò)堆棧的基地址和偏移量來(lái)訪問(wèn)本地變量捷凄。

51. C++函數(shù)中值的傳遞方式有哪幾種?

答:三種傳遞方式為:值傳遞忱详、指針傳遞和引用傳遞。

52. C++里面是不是所有的動(dòng)作都是main()引起的跺涤?如果不是匈睁,請(qǐng)舉例.

比如全局變量的初始化,就不是由main函數(shù)引起的

舉例: class A{};

A a; //a的構(gòu)造函數(shù)執(zhí)行

int main() {}

54. 內(nèi)聯(lián)函數(shù)在編譯時(shí)是否做參數(shù)類型檢查桶错?

答:內(nèi)聯(lián)函數(shù)要做參數(shù)類型檢查, 這是內(nèi)聯(lián)函數(shù)跟宏相比的優(yōu)勢(shì)航唆。

55. 全局變量和局部變量有什么區(qū)別?實(shí)怎么實(shí)現(xiàn)的院刁?操作系統(tǒng)和編譯器是怎么知道的糯钙?

(1)生命周期不同:

全局變量隨主程序創(chuàng)建和創(chuàng)建,隨主程序銷毀而銷毀

局部變量在局部函數(shù)內(nèi)部,甚至局部循環(huán)體等內(nèi)部存在任岸,退出就不存在再榄; 內(nèi)存中

分配在全局?jǐn)?shù)據(jù)區(qū)

(2)使用方式不同:通過(guò)聲明后全局變量程序的各個(gè)部分都可以用到;局部變量只能在局部使用享潜,分配在棧區(qū)

操作系統(tǒng)和編譯器通過(guò)內(nèi)存分配的位置來(lái)知道的困鸥,全局變量分配在全局?jǐn)?shù)據(jù)段并且在程序開(kāi)始運(yùn)行的時(shí)候被加載。局部變量則分配在堆棧里面 剑按。

57.static全局變量與普通的全局變量有什么區(qū)別疾就?static局部變量和普通局部變量有什么區(qū)別艺蝴?static函數(shù)與普通函數(shù)有什么區(qū)別猬腰?

答:static全局變量與普通全局變量區(qū)別:static全局變量只初使化一次吴趴,防止在其他文件單元中被引用;

static局部變量和普通局部變量區(qū)別:static局部變量只被初始化一次漆诽,下一次依據(jù)上一次結(jié)果值锣枝;

static函數(shù)與普通函數(shù)區(qū)別:static函數(shù)在內(nèi)存中只有一份厢拭,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝。

58.?程序的局部變量存在于(堆棧)中撇叁,全局變量存在于(靜態(tài)區(qū)?)中供鸠,動(dòng)態(tài)申請(qǐng)數(shù)據(jù)存在于(?堆)中陨闹。

59.?對(duì)于一個(gè)頻繁使用的短小函數(shù),在C語(yǔ)言中應(yīng)用什么實(shí)現(xiàn),在C++中應(yīng)用什么實(shí)現(xiàn)?

c用宏定義,c++用inline

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末趋厉,一起剝皮案震驚了整個(gè)濱河市寨闹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌君账,老刑警劉巖繁堡,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異椭蹄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)绳矩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門玖翅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翼馆,“玉大人,你說(shuō)我怎么就攤上這事写妥∩笮眨” “怎么了珍特?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵魔吐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嗜桌,道長(zhǎng),這世上最難降的妖魔是什么骨宠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任相满,我火速辦了婚禮层亿,結(jié)果婚禮上立美,老公的妹妹穿的比我還像新娘。我一直安慰自己建蹄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布洞慎。 她就那樣靜靜地躺著,像睡著了一般旭绒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谆棱,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蔫劣,去河邊找鬼。 笑死脉幢,一個(gè)胖子當(dāng)著我的面吹牛歪沃,可吹牛的內(nèi)容都是我干的嫌松。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼萎羔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了贾陷?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巷懈,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后顶燕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涌攻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年犯助,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剂买。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞬哼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情较性,我是刑警寧澤结胀,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站糟港,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏速和。R本人自食惡果不足惜歹垫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一颠放、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碰凶,春花似錦、人聲如沸痒留。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舷蟀。三九已至,卻和暖如春野宜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匈子。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留游岳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓胚迫,卻偏偏與公主長(zhǎng)得像唾那,于是被迫代替她去往敵國(guó)和親访锻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闹获,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 1.面向?qū)ο蟮某绦蛟O(shè)計(jì)思想是什么? 答:把數(shù)據(jù)結(jié)構(gòu)和對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作的方法封裝形成一個(gè)個(gè)的對(duì)象避诽。 2.什么是類?...
    少帥yangjie閱讀 4,992評(píng)論 0 14
  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束遣总,并將收入和稅金輸出到文件tax. out睬罗。 檢查...
    SeanC52111閱讀 2,764評(píng)論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法旭斥,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法垂券,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法菇爪,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評(píng)論 1 51
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,131評(píng)論 30 470